scanf参数的差异

时间:2015-06-24 09:36:46

标签: c scanf

当我编写程序时,我不会注意scanf的参数。 有什么区别:

scanf("%d %d", &x,&y);

scanf("%d%d", &x,&y);

注意%d之间的空格。 我试过我的电脑,但我看不出其中的差别。

另外,%c代替%d -

之间的区别是什么
scanf("%c %c", &x,&y);

scanf("%c%c", &x,&y);

你能给我一些有用的例子来理解这个愚蠢的事吗?

3 个答案:

答案 0 :(得分:2)

在你的情况下,无论你是否在它们之间放置空格,它们都会产生相同的结果:)

来自cppreference

  

在尝试解析输入之前,除[,c和n之外的所有转换说明符都会消耗并丢弃所有前导空白字符(通过调用isspace确定)。这些消耗的字符不计入指定的最大字段宽度。

     

不使用前导空格的转换说明符,例如%c,可以通过在格式字符串中使用空格字符来实现:

scanf("%d", &a);
scanf(" %c", &c); // ignore the endline after %d, then read a char

所以你的例子:scanf("%c%c", &x, &y);不会跳过空白。
如果您输入a b后输入,则会显示a和空格 另一方面,如果您输入ab,它将根据您的需要读取a和b。

在示例中:scanf("%c %c", &x, &y);,如果您输入a并按Enter键,它将忽略换行符,并让您输入另一个字符。

答案 1 :(得分:1)

在读取第一个整数后,

scanf("%d %d", &x, &y)将占用空间(如果有),然后读取第二个整数,而scanf("%d%d", &x, &y)将在读取两个整数时忽略空格。但是,两者在运行时都会产生相同的结果。

答案 2 :(得分:1)

匹配空格的格式指令(例如isspace返回true的任何内容)会导致从流中读取和丢弃尽可能多的空格(在本例中为stdin)。

无论如何,在%d格式指令翻译数字之前需要此过程;也就是说,%d指令将读取并丢弃尽可能多的空格,然后读取并将符号和/或十进制数字序列转换为int

总之,无论有没有whitespace指令,这两个语句的功能都是相同的;在这种情况下,whitespace指令是多余的。