如何忽略scanf中的浮点数("%d")?

nik*_*iko 10 c scanf

如果用户输入整数变量的浮点数,我想打印无效输入.那可能吗?

 int a;
 scanf("%d",&a); // if user enters 4.35 print invalid input 
Run Code Online (Sandbox Code Playgroud)

我试过像这样的人物

  if(scanf("%d",&a)==1);
  else printf("invalid input");
Run Code Online (Sandbox Code Playgroud)

但如何处理浮动数字.如果用户输入4.35它截断到4但我想要无效输入.

Jon*_*ler 11

由于小数点之前的任何数字的浮点数的开始看起来像一个整数,因此无法%d单独检测到这一点.

您可以考虑阅读整行,fgets()然后分析sscanf():

int a;
int n;
char line[4096];
if (fgets(line, sizeof(line), stdin) != 0 && sscanf(line, "%d%n", &a, &n) == 1)
   ...analyze the character at line[n] for validity...
Run Code Online (Sandbox Code Playgroud)

(是的,我的意思是与1进行比较; %n转换规范不计入sscanf()等人的返回值.)

scanf()此代码不执行的一件事是在输入数字之前跳过空白行.如果这很重要,你必须编写一个循环来读取(非空)行,然后解析非空行.您还需要确定线路上有多少尾随垃圾(如果有的话).是否允许空白?标签?阿尔法字符?标点?

  • 这有点过于复杂吗? (5认同)
  • 这取决于你想要什么.使用`fgets()`和`sscanf()`通常比`scanf()`更好; 它将更容易报告用户以这种方式输入的内容.因此,解决方案的因素.这留下`sscanf(行,"%d%n",&a,&n)== 1`并检查您没有小数点(默认为`.`,但一般是特定于语言环境),或者` e`或`E`作为下一个字符; 其他任何意味着输入的值是一个整数.即使是"E"也不是严格证据; 你需要看到"E"和一个数字.1.2E是带有E的数字1.2,AFAIK(虽然我今天没有测试过它). (2认同)
  • @thejh C中强大的I/O很复杂! (2认同)