使用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!?]