C控制台应用程序在循环后提供笑脸
当我在C控制台应用程序在循环后提供笑脸,c,C,当我在案例1之后调用案例2时,下面的代码会生成两个笑脸(换言之,在一个while循环之后)。然而printstation()在情况1中正常工作 #包括 #包括 字符*输入句子(); 无效打印句子(字符*); 字符*语句; int=1; main(){ while(将继续){ INTA; scanf(“%d”和“&a”); 开关(a){ 案例1: getchar(); 句子=输入句子(); 打印句子(句子); 打破 案例2: getchar(); 打印句子(句子); 打破 案例3: willCon
案例1
之后调用案例2
时,下面的代码会生成两个笑脸(换言之,在一个while
循环之后)。然而printstation()代码>在情况1中正常工作
#包括
#包括
字符*输入句子();
无效打印句子(字符*);
字符*语句;
int=1;
main(){
while(将继续){
INTA;
scanf(“%d”和“&a”);
开关(a){
案例1:
getchar();
句子=输入句子();
打印句子(句子);
打破
案例2:
getchar();
打印句子(句子);
打破
案例3:
willContinue=0;//退出
打破
}
}
}
char*entertainment(){
字符温度[999];
获取(临时);
返回温度;
}
无效打印语句(字符*asd){
存托凭证(asd);
}
.
. //更多代码
.
我想知道这里出了什么问题,谢谢您的帮助。temp
是函数enterprise
的本地函数。它在函数输入时创建,在函数终止时销毁
当您返回对象的地址(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;
}
temp
是函数输入语句的本地值。它在函数输入时创建,在函数终止时销毁
当您返回对象的地址(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;
}
存储在语句
中的前一个值保持原样。存储在语句
中的前一个值保持原样。语句
似乎在每次循环后都不会被清除。哦!不要使用get()
。它无法安全使用,已从最新的C标准(C11)中删除。语句在每次循环后似乎都不会被清除。噢!不要使用get()
。它不能安全使用,已从最新的C标准(C11)中删除。