Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当scanf在c中返回0,并且不';行不通_C_Scanf - Fatal编程技术网

当scanf在c中返回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);

“当没有成功的赋值”我知道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);
      }
   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