当代码中遇到多个
scanf()
语句时,则除了第一个scanf()
语句外,其他语句都会被跳过,即代码运行时不会提示输入这些scanf()
语句。
我尝试了一些建议。例如,在某些网站上建议使用
flushall()
,但这会产生编译错误。
非常感谢任何帮助。
[代码已添加为答案。]
检查scanf()的返回值!
来自手册页: “scanf 返回分配的输入项的数量,如果匹配失败,该数量可能少于提供的数量,甚至为零。零表示虽然有可用的输入,但未分配任何转换;通常这是由于无效的输入字符,例如“%d”转换的字母字符。如果在发生任何转换(例如文件结束符)之前发生输入失败,则返回值 EOF。如果出现错误或文件结束符发生在转换开始后,返回成功完成的转换数量。”
代码和输入的示例肯定会提高我们帮助您解决特定问题的能力,因为有很多潜在情况可能会导致问题。
示例(我很快就能想到):
我一直认为 scanf() 很危险,因为它会使您的输入流处于不确定状态。
我更喜欢使用其他(更安全)的命令来引入字符串(fgets 等),然后使用 sscanf 来处理它。然后您可以随时备份到字符串的开头并重新启动。
这听起来像是一些转换问题。 %s 转换可能永远不会结束,或者您指定了一个永远不会输入的字符或类似的内容。我建议如下: A。尝试类似的方法: 整数a=0; 整数b=0; scanf("%d",&a); scanf("%d", &b); printf("a=%d, b=%d ”、a、b); 如果这有效,请尝试增加转化,看看是哪一个导致了问题。
代码很简单:
#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!?]
始终在任何“scanf();”之前使用“fflush(stdin);””语句,因为除非并且直到您不清除标准输入流 scanf 语句将读取 std i/p 中已存在的值。
我对编码相当陌生,但我以前遇到过这个问题,并在课堂上了解到,最好不要在每次 scanf 之前使用 fflush。 相反,请在 scanf 内的格式说明符之前放置一个空格(即您看到的“%d”或“%c%”)。
将跳过的内容示例:
`#包括
int main(int argc, const char * argv[]) { 字符 字符1,字符2;
scanf("%c", &char1);
scanf("%c", &char2);
return 0;
} ` 这将读取 char1,但会跳过 char2。 (实际上,您在 char1 之后键入的返回字符将被读取为 char2。) 为了防止这种情况,请像下一个示例一样放置一个空格。
不会跳过的示例:
#include <stdio.h>
int main(int argc, const char * argv[]) { 字符 字符1,字符2;
scanf(" %c", &char1);
scanf(" %c", &char2);
return 0;
}
在本例中,您只需要第二个 scanf 的空间,但我将其放置在两个 scanf 中,以防万一,因为我可能会编写其他内容或更改代码,并且这样更容易将其放置在那里。
希望有帮助。