C:scanf上的循环
对于我的scanf,我想占用空间。但是,如果我运行这部分代码,“Enter message:”将处于无限循环中 如果我仅将scanf更改为“%s”,则它可以正常工作,但我无法接受中间有空格的输入 有人能帮我找出它是如何抛出无限循环的,或者有什么办法来解决这个问题吗?C:scanf上的循环,c,scanf,C,Scanf,对于我的scanf,我想占用空间。但是,如果我运行这部分代码,“Enter message:”将处于无限循环中 如果我仅将scanf更改为“%s”,则它可以正常工作,但我无法接受中间有空格的输入 有人能帮我找出它是如何抛出无限循环的,或者有什么办法来解决这个问题吗?scanf()读一行有太多方法出错。使用fgets() 不要使用fflush(stdin),这是未定义的行为为什么要使用write和fwrite?我想换行符会留在缓冲区中,因此后续调用scanf读取零字符。@user3121023完美
scanf()
读一行有太多方法出错。使用fgets()
不要使用
fflush(stdin)
,这是未定义的行为为什么要使用write
和fwrite
?我想换行符会留在缓冲区中,因此后续调用scanf
读取零字符。@user3121023完美的解决方案是fgets()
fflush(stdin)
与某些平台/编译器配合使用以刷新stdin
。然而,C标准没有规定这一点,而是未定义的行为。它不是便携式的。
char buf[1024] = {0};
// send a message
if(status == 0) {
while(1) {
printf("Enter message : ");
scanf("%1023[^\n]", buf);
fflush(stdin);
if(strcmp(buf,"quit")==0)
break;
status = write(s, buf, strlen(buf));
fflush(stdout);
memset(buf,0,sizeof buf);
}
}
char buf[1024] = {0};
// send a message
if(status == 0) {
while(1) {
printf("Enter message : ");
if (fgets(buf, sizeof buf, stdin) == NULL) break;
//scanf("%1023[^\n]", buf);
//fflush(stdin);
buf[strcspn(buf, "\n")] = '\0'; // lop off potential \n
if(strcmp(buf,"quit")==0)
break;
status = write(s, buf, strlen(buf));
// fflush(stdout);
memset(buf,0,sizeof buf);
}
}