gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:06:56 25 4
gpt4 key购买 nike

当我在 case 1 之后调用 case 2 时(换句话说,在一个 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
.

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

最佳答案

templocal 函数 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;
}

关于C控制台应用程序在循环后给出笑脸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8620660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com