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

Gho*_*kun 0 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
 .
Run Code Online (Sandbox Code Playgroud)

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

pmg*_*pmg 5

temp是函数的本地enterSentence.它是在输入函数时创建的,并在函数终止时被销毁.

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

快速而肮脏的解决方案:制作temp一个自程序启动直至结束的静态对象

static char temp[999];
Run Code Online (Sandbox Code Playgroud)

注意: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;
}
Run Code Online (Sandbox Code Playgroud)