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)中删除。