C控制台应用程序循环后给出笑脸

时间:2011-12-23 21:10:31

标签: c

当我在case 2之后调用case 1(换句话说,在一个while循环之后)时,下面的代码会产生两个笑脸。但是,printSentence();的工作方式与case 1中的工作方式相同。

#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
 .

我想知道这里有什么问题,感谢您的帮助..

2 个答案:

答案 0 :(得分:5)

temp local 到函数enterSentence。它是在输入函数时创建的,并在函数终止时被销毁。

当你返回对象的地址(return temp;)时,它仍然存在且具有该地址,但之后会立即销毁,并且调用函数会收到指向无效位置的指针。

快速而肮脏的解决方案:使temp成为自程序启动以来可以存活的静态对象

static char temp[999];

注意:正如我所说,static是一个快速而肮脏的解决方案。最好避免使用它。


修改

缓慢而干净的解决方案:将temp对象移动到调用函数并将其指针传递给函数

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;
}

答案 1 :(得分:0)

sentence中存储的先前值保持不变。