[완료]c언어를 막 배우고 있는 학생입니다. 문자열 반환에 관하여 질문드립니다. ㅜㅜ

ruydoo0711의 이미지

문제는 입력받은 문자열을 거꾸로 출력하는 문제를 풀다

문자열 포인터를 반환하여 문자열을 출력하려하는데

반환값을 받고나서 주소에들어있는 값들이 바뀌는데 도무지 뭐가 문제인지 감이 안잡혀 질문드립니다.

#include
#include
#include

char* revers(char *, int);

void main(void){
char word[20];
int len;
char *p2;

printf("한단어를 입력하세요. -> ");
gets(word);

printf("입력한 단어를 반대로 출력합니다. -> ");
p2=revers(word, len = strlen(word));


printf("\n---");
printf("\n%d %c", p2+0, *p2);
printf("\n%d %c", p2+1, *(p2+1));
printf("\n%d %c", p2+2, *(p2+2));

}

char* revers(char * word, int len){
char result[20];
int i=0;
int j=len-1;
char * p;

printf("%s\n", word);
printf("%d\n", len);

while(i *(result+i) = *(word + j);
i++;
j--;
}

p=result;
*(result+i)='\0';

printf("\n%d %c", p+0, *p);
printf("\n%d %c", p+1, *(p+1));
printf("\n%d %c", p+2, *(p+2));

printf("\n---");
printf("\n%d %c", result+0, *result);
printf("\n%d %c", result+1, *(result+1));
printf("\n%d %c", result+2, *(result+2));

return p;
}

printf문은 비교하기위해 포인터변수와 배열들을 처음주터 3개까지 주소와 값을 출력했습니다.

rookey94의 이미지

본인의 짠 함수랑 비교해 보시면 문제를 찾으실수 있으리라 생각합니다. 홧팅!!!

char* revers2(char* word)
{
printf("%s\n", word);

char c;
char *p1 = word;
char *p2 = word + strlen(word) - 1;

while (p1 < p2)
{
c = *p1;
*p1 = *p2;
*p2 = c;
p1++; p2--;
}

return word;

}

ruydoo0711의 이미지

제가 생각이 짧았습니다.

저런방법도 있었는데 생각을 못했습니다. 감사합니다.

적어주신 주소로 접근하여 바꾸는 방법도 해보겠습니다.

익명 사용자의 이미지

전체적으로 다듬었으면 하는 부분들이 몇 군데 보이는데요.

일단 문제되는 부분만 말씀드리자면

메인 함수에서

p2=revers(word, len = strlen(word));

이부분이 되겟습니다.

p2에 대입된 주소는 revers 함수 호출 이후에는 참조 했을시 문제가 됩니다.

결정적으로 값이 바뀌는 부분은 이 이후 printf 함수를 호출한 이후가 되고요.

디버그 모드로 수행해서 살펴 보시면 확인 가능하시리라 생각됩니다.

참고로 로컬 변수의 라이프 타임과 함수 호출과 스텍의 관계에 대해 찾아 보시면 좋은 설명들이 많이 있습니다.

여러 방법으로 해결하실 수 있지만

revers 함수에 선언된 result 배열을 메인 함수로 옮겨 선언 하시고 이주소를 revers 호출시 같이 넘겨 주셔도 되겠습니다.

ruydoo0711의 이미지

아직 배울게 정말 많네요 라이프타임을 배웠음에도 불구하고 이렇게 또 한번 학습하네요

감사합니다. 더 열심히 하겠습니다.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.