[완료]c언어를 막 배우고 있는 학생입니다. 문자열 반환에 관하여 질문드립니다. ㅜㅜ
문제는 입력받은 문자열을 거꾸로 출력하는 문제를 풀다
문자열 포인터를 반환하여 문자열을 출력하려하는데
반환값을 받고나서 주소에들어있는 값들이 바뀌는데 도무지 뭐가 문제인지 감이 안잡혀 질문드립니다.
#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개까지 주소와 값을 출력했습니다.
본인의 짠 함수랑 비교해 보시면 문제를 찾으실수
본인의 짠 함수랑 비교해 보시면 문제를 찾으실수 있으리라 생각합니다. 홧팅!!!
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;
}
정말 감사드립니다.
제가 생각이 짧았습니다.
저런방법도 있었는데 생각을 못했습니다. 감사합니다.
적어주신 주소로 접근하여 바꾸는 방법도 해보겠습니다.
전체적으로 다듬었으면 하는 부분들이 몇 군데
전체적으로 다듬었으면 하는 부분들이 몇 군데 보이는데요.
일단 문제되는 부분만 말씀드리자면
메인 함수에서
p2=revers(word, len = strlen(word));
이부분이 되겟습니다.
p2에 대입된 주소는 revers 함수 호출 이후에는 참조 했을시 문제가 됩니다.
결정적으로 값이 바뀌는 부분은 이 이후 printf 함수를 호출한 이후가 되고요.
디버그 모드로 수행해서 살펴 보시면 확인 가능하시리라 생각됩니다.
참고로 로컬 변수의 라이프 타임과 함수 호출과 스텍의 관계에 대해 찾아 보시면 좋은 설명들이 많이 있습니다.
여러 방법으로 해결하실 수 있지만
revers 함수에 선언된 result 배열을 메인 함수로 옮겨 선언 하시고 이주소를 revers 호출시 같이 넘겨 주셔도 되겠습니다.
친절한 답변 감사드립니다.
아직 배울게 정말 많네요 라이프타임을 배웠음에도 불구하고 이렇게 또 한번 학습하네요
감사합니다. 더 열심히 하겠습니다.
댓글 달기