scanf() (和 cin)语句

问题描述 投票:0回答:7

当代码中遇到多个

scanf()
语句时,则除了第一个
scanf()
语句外,其他语句都会被跳过,即代码运行时不会提示输入这些
scanf()
语句。

我尝试了一些建议。例如,在某些网站上建议使用

flushall()
,但这会产生编译错误。

非常感谢任何帮助。

[代码已添加为答案。]

gcc scanf
7个回答
3
投票

检查scanf()的返回值!

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


2
投票

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

示例(我很快就能想到):

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

0
投票

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

我更喜欢使用其他(更安全)的命令来引入字符串(fgets 等),然后使用 sscanf 来处理它。然后您可以随时备份到字符串的开头并重新启动。


0
投票

这听起来像是一些转换问题。 %s 转换可能永远不会结束,或者您指定了一个永远不会输入的字符或类似的内容。我建议如下: A。尝试类似的方法: 整数a=0; 整数b=0; scanf("%d",&a); scanf("%d", &b); printf("a=%d, b=%d ”、a、b); 如果这有效,请尝试增加转化,看看是哪一个导致了问题。


0
投票

代码很简单:

#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!?]

0
投票

始终在任何“scanf();”之前使用“fflush(stdin);””语句,因为除非并且直到您不清除标准输入流 scanf 语句将读取 std i/p 中已存在的值。


0
投票

我对编码相当陌生,但我以前遇到过这个问题,并在课堂上了解到,最好不要在每次 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 中,以防万一,因为我可能会编写其他内容或更改代码,并且这样更容易将其放置在那里。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.