下面的代码在我打电话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)
我想知道这里有什么问题,感谢您的帮助..
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)