2011-12-23 2 views
0

case 2case 1 (즉, while 루프 이후)이라고 말하면 아래 코드는 두 개의 웃는 얼굴을 만듭니다. 그러나 case 1이어야하므로 printSentence();이 작동합니다.루프 후 C 콘솔 응용 프로그램이 웃는 얼굴을 내 보냅니다.

#include <stdio.h> 
#include <string.h> 

    char *enterSentence(); 
    void printSentence(char *); 
    char *sentence; 
    int willContinue = 1; 

main() { 
    while (willContinue) { 
    int a; 
    scanf("%d", &a); 
    switch (a) { 
      case 1: 
       getchar(); 
       sentence = enterSentence(); 
       printSentence(sentence); 
       break; 
      case 2: 
       getchar(); 
       printSentence(sentence); 
       break; 
      case 3: 
       willContinue = 0; //exit 
       break; 
       } 
    } 
} 

char *enterSentence() { 
     char temp[999]; 
     gets(temp); 
     return temp; 
     } 

void printSentence(char *asd) { 
     puts(asd); 
     } 
. 
. //more code 
. 

나는 문제가 여기에 어떤 도움을 주셔서 감사 무엇인지 궁금 ..

+0

'sentence'는 각 루프 후에 지워지지 않는 것처럼 보입니다. – Blender

+1

오! 'gets()'를 사용하지 마십시오. 안전하게 사용할 수 없으며 최신 C 표준 (C11)에서 제거되었습니다. – pmg

답변

5

temp 함수 enterSentence-지역입니다. 함수가 입력 될 때 만들어지며 함수가 종료 될 때 파괴됩니다.

개체의 주소 (return temp;)를 반환하면 해당 주소가 있지만 해당 주소는 즉시 삭제되고 호출하는 함수는 잘못된 위치에 대한 포인터를받습니다.

신속하고 더러운 솔루션 : 프로그램이 시작된 이후 종료까지 살 수 temp 정적 객체를 만들

static char temp[999]; 

참고 : 내가 말했듯이 static는, 신속하고 더러운 솔루션입니다. 대부분 피하는 것이 좋습니다.


편집

느린하고 깨끗한 솔루션 : 호출 함수에 temp 객체를 이동하고 그대로 sentence에 저장된 이전 값이 유지 기능

int main(void) { 
    char temp[999]; 
    /* ... */ 
    enterSentence(temp, sizeof temp); 
    /* ... */ 
} 

size_t enterSentence(char *dst, size_t len) { 
    size_t retlen; 
    fgets(dst, len, stdin); 
    retlen = strlen(dst); 
    if (dst[retlen - 1] == '\n') dst[--retlen] = 0; 
    return retlen; 
} 
+0

매우 유익한 답변입니다. 고맙습니다! – Ghokun

0

에의 포인터를 전달합니다.

관련 문제