当scanf在c中返回0,并且不';行不通
“当没有成功的赋值”我知道scanf返回0来表示它,但这是它唯一做的事情吗?这是我的代码:当scanf在c中返回0,并且不';行不通,c,scanf,C,Scanf,“当没有成功的赋值”我知道scanf返回0来表示它,但这是它唯一做的事情吗?这是我的代码: #include<stdio.h> int main(void) { int val,x; x=scanf("%d",&val); if(x==1) printf("success!"); else{ printf("try again\n"); scanf("%d",&val);
#include<stdio.h>
int main(void) {
int val,x;
x=scanf("%d",&val);
if(x==1)
printf("success!");
else{
printf("try again\n");
scanf("%d",&val);
}
return 0;
}
这意味着它不允许我输入新值,为什么?代码中有什么错误吗?如果是,我如何修复它?我应该停止使用scanf吗?当
scanf
不起作用时,无效数据仍保留在流中。在输入更多数据之前,必须先从流中读取并丢弃数据
#include<stdio.h>
int main(void) {
int val,x;
x=scanf("%d",&val);
if(x==1)
printf("success!");
else{
// Discard everything upto and including the newline.
while ( (x = getchar()) != EOF && x != '\n' );
printf("try again\n");
scanf("%d",&val);
}
return 0;
}
#包括
内部主(空){
int-val,x;
x=scanf(“%d”和&val);
如果(x==1)
printf(“成功!”);
否则{
//放弃所有内容,包括换行符。
而((x=getchar())!=EOF&&x!='\n');
printf(“重试\n”);
scanf(“%d”和&val);
}
返回0;
}
scanf函数系列按规定被破坏,不应用于任何用途
编写此程序的正确方法是使用(如果可用)或其他方法读取整行用户输入。然后使用将输入转换为机器整数,注意检查错误:
errno = 0;
result = strtol(line, &endptr, 10);
if (endptr == line || *endptr != '\n' || errno)
// invalid input
不要使用
scanf
。使用fgets()
读取整行,然后使用sscanf
处理行中的数据。也不要使用sscanf
。使用fgets()
读取整行数据,然后使用strtol
和friends处理行中的数据。只有这些功能在面对任意格式错误的输入时才是可靠的。谢谢!我会尝试这些解决方案!你不应该教人们使用scanf
;你应该教其他的选择。我知道你知道它们是什么。非常感谢!如果你能解释一下你做了什么,请@通常,x=gechar()
从输入流中获取下一个字符。只要x
不是EOF
并且它不是'\n'
,while循环就会继续这样做。如果x
等于EOF
或'\n'
,程序在循环时会中断。@zwol,我理解scanf
的危险性。然而,我并不禁止它的使用。在编写生产代码时,我从不忽略scanf
@RSahu的返回值,如果您真正了解scanf
的危险,您将禁止使用它。(请特别注意,%s
的每一位都和的每一位一样危险,并且数字溢出是未定义的行为。)
errno = 0;
result = strtol(line, &endptr, 10);
if (endptr == line || *endptr != '\n' || errno)
// invalid input