문자자르는 함수..함 봐주세요.

pogs의 이미지

#include <stdio.h>

char *strparser(char *src, int pos)
{
char des[8];
int i;
for(i=0;i<pos;i++)
{
des[i]= src[i];
}
printf("des [%s]\n", des);
return des;
}

main()
{
strparser("12345678",5);
}

위 프로그램은 pos까지 짤라서 반환하는 함수인데요.

des[i]= src[i]; --> des[i] =src+i 로 바꾸면 안되네요... 이유좀 알수 있을까요? 제가알기로는 src+0은 1 src +1은 2 이런식으로 되는걸로 알고 있는데...

다름과 같은 메시지가... warning: improper pointer/integer combination: op "="

jj의 이미지

des[i] =src+i
는 아니구요 des[i] = *(src+i)

또한 char des[8] 은 stack에 있기 때문에, 이 값을 리턴하면 문제가 있습니다. 리턴된다음 곧장 보면 되는것 처럼 보이지만, 다른 함수를 호출한 다음 보면 값이 깨지죠...

--
Life is short. damn short...

shs0917의 이미지

src + 1이 아니라 *(src + 1)을 하면 올바른 결과가 나와요..
이건 포인터 사용에 대한 기초적인 개념인데요..
저도 포인터를 항상 사용함에도 불구하고 자주 실수하죠..
연산자 우선순위 때문에.. 저렇게 괄호로..
이래저래 테스트 해보면 저렇게 하면 올바른 값이 나옵니다.
*(src +1)의 의미는 *src의 주소값을 1씩 증가.. 바로 님이 원하던
의미이죠.. 포인터에 대해 기초부분을 조금만 보시면 금방 이해
되실겁니다.. 글면 오늘도 즐플~

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

서지훈의 이미지

pogs wrote:
des[i]= src[i]; --> des[i] =src+i 로 바꾸면 안되네요...

des = src + i; 이게 문법적으로 맞는 겁니다. 그리고 char *strparser(char *src, int pos); 이 함수 자체가 잘 못 됐네요... 이건 그냥 단순히...

char des[128];
strncpy(des ,src + pos, 128);
OR
char *des;
des = src + pos;
이렇게 하면은 원하는 결과를 얻을 수가 있습니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

shs0917의 이미지

제가 글을 올리는 사이 저보다 간발의 차이로 먼저 올리신 분이..
근데... 서지훈님이 확실한 답변을 또 간발의 차이로 뒤에 올리시공..
거의 채팅수준(?)의 리플이군요.. 쩝~

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

jj의 이미지

그렇네요. 제가 코드도 안보고... tyep만 맞추느라. 제가 올린거 무시하시길. ㅋㅋ

--
Life is short. damn short...

shs0917의 이미지

제꺼도 무시하세요.. 도움 드리고 싶었는데요.. 실수좀 했네요

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

bluemoon의 이미지

des = src + pos;

프로그래머가 의도한 값이 나올까요..;
(만약 문자열 뒤쪽을 끊을려고 했다면)
마지막에 '\0' 종료문자를 추가해주면 좋겠네요.

sangwoo의 이미지

서지훈 wrote:
pogs wrote:
des[i]= src[i]; --> des[i] =src+i 로 바꾸면 안되네요...

des = src + i; 이게 문법적으로 맞는 겁니다. 그리고 char *strparser(char *src, int pos); 이 함수 자체가 잘 못 됐네요... 이건 그냥 단순히...

char des[128];
strncpy(des ,src + pos, 128);
OR
char *des;
des = src + pos;
이렇게 하면은 원하는 결과를 얻을 수가 있습니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

char des[128];
strncpy(des, src, pos);
des[pos] = '\0';
이게 처음 함수랑 같은거 아닌가요? :shock:

----
Let's shut up and code.

bluemoon의 이미지

borishim wrote:
char des[128];
strncpy(des, src, pos);
des[pos] = '\0';

strncpy함수는 대상공간이 원시공간보다 클 경우엔 종료문자를 처리해줍니다..

sangwoo의 이미지

bluemoon wrote:
borishim wrote:
char des[128];
strncpy(des, src, pos);
des[pos] = '\0';

strncpy함수는 대상공간이 원시공간보다 클 경우엔 종료문자를 처리해줍니다..

char *strncpy(char *dest, const char *src, size_t n);

src의 첫번째 n바이트 안에 null byte가 있을 경우에 null-termination 처리를 해 줍니다. 즉, dest이 src보다 클 경우가 아니라, n이 src보다 큰 경우라는 이야기지요. 가령 다음의 코드는

        char    *ptr;

        ptr = malloc(sizeof(char) * 10);
        strncpy(ptr, "testsentence", 5);
        printf("%s\n", ptr);

        free(ptr);

보통 Segmentation fault를 일으킵니다.
뭐 중요한 건 아닙니다. :oops:

----
Let's shut up and code.

moonzoo의 이미지

저도 strncpy가 null을 추가 해주는 줄 알았는데

단순히 src의 null를 그대로 옮겨준것 뿐이었군여..

덕분에 착각하기 쉬운거 오늘 다시 정리했네여.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.