使用gcc时会跳过scanf()(和cin)语句

时间:2020-03-05 18:58:06  来源:igfitidea点击:

当代码中遇到多个scanf()语句时,除第一个scanf()语句外,所有其他语句都将被跳过,也就是说,当代码运行。

我尝试了一些建议。例如,在某些站点上建议使用flushall(),但这会导致编译错误。

任何帮助,不胜感激。

[添加了代码作为答案。]

解决方案

回答

我一直认为scanf()很危险,因为它会使输入流处于不确定状态。

我更喜欢使用其他(更安全的)命令来输入字符串(fgets等),然后使用sscanf对其进行处理。然后,我们始终可以备份到字符串的开头并重新启动。

回答

听起来有些转换问题。可能是%s转换永远不会结束,或者我们指定了一个永远不会输入的字符或者类似的字符。我建议以下内容:
一种。尝试类似的东西:
int a = 0;
int b = 0;
scanf("%d",&a);
scanf("%d",&b);
printf(" a =%d,b =%d \ n",a,b);
如果这样做有效,请尝试增加转换次数,以查看引起问题的原因。

回答

检查scanf()的返回值!

从手册页:
" scanf返回分配的输入项目的数量,如果匹配失败,该数量可能少于提供的数量,甚至为零。零表示虽然有可用的输入,但没有分配转换;通常是由于无效的输入字符,例如用于%d转换的字母字符。如果在进行任何转换(例如文件结束)之前发生输入失败,则返回EOF值;如果在文件转换之后发生错误或者文件结束转换已开始,将返回成功完成的转换次数。"

回答

代码和输入示例肯定会提高我们为我们解决特定问题的能力,因为存在很多可能导致问题的潜在情况。

示例(我可以很快想到):

  • 格式字符串与输入流中的下一个字符不匹配。因此scanf不会读取任何内容。
  • 仅当遇到满或者返回时,才刷新stdin输入缓冲区。
  • 来自1行输入的输入可以由多个scanf语句使用。随后的scanf语句在最后一个中断的地方继续执行。因此,程序不会因用户输入而停止。
  • %s在scanf和printf printf上的行为不同,它会打印整个字符串。 scanf读取一个空格分隔的单词

回答

该代码很简单,因为它是:

#include <stdio.h>
int main()
{
long int z,s,n,i,j,m,x;
scanf("%ld ",&z);
for(i=0; i<z; i++)
  {
  scanf("%ld",&s); n=0;
  for (j=0; j<s; j++) { scanf("%ld",&m); n+=m; }
  x=n+s-1;
  printf("%ld\n",n);
  }
return 0;
}

汇编:

D:\edycja>gcc WSEGA.c -o WSEGA.exe -Wall

D:\edycja>WSEGA.exe

D:\edycja> [Where was the program!?]