1

我对这种语法感到困惑。起初,我以为是书的印刷错误。但是,在编程了很长一段时间后,我才知道它们有不同的含义。尽管如此,我还是无法对该语法有清晰的认识。

同样,有什么区别:

gets( str);gets(str);

空格重要吗?如果是,那么如何?

4

4 回答 4

5

scanf格式字符串中添加空格时,您告诉scanf读取并跳过空格。例如,跳过输入中的换行符会很有用。另请注意,某些格式无论如何都会自动跳过空格。

有关函数族的良好参考,请参见此处。scanf


和...之间的不同

gets(str);

gets( str );

根本没有。字符串文字之外的实际代码可以使用任意数量的空格进行格式化。你甚至可以把上面的调用写成

gets
    (
        str
    )
;

它仍然是一样的。

哦,这个gets函数很久以前就被弃用了,甚至从最新的 C 标准中删除了。你应该fgets改用。

于 2013-11-12T07:36:36.387 回答
2

格式字符串中的空格(例如空格、制表符或换行符)与输入中的任意数量的空格匹配,包括none

http://www.manpagez.com/man/3/scanf/

gets空间中没有任何意义。它在编译时被忽略。

于 2013-11-12T07:37:02.083 回答
1

编译器有很多阶段,在第一阶段词法分析中,所有不必要的空格都被删除了,这也是当时将被删除的不必要的空格,因此,gets(a) and gets( a).

于 2013-11-12T08:27:02.167 回答
0

这里有两个关于 scanf 的重要知识:

  1. 除 %c 和 %[ 之外的所有转换修饰符都忽略扫描项目前的空格。
  2. 您可以显式调用此忽略所有空格的行为,如下所示:

    scanf(" %c", &mychar)

    scanf("\n%c", &mychar)

    scanf("\t%c", &mychar)

也就是说,转换字符串中的任何空格字符(包括空格)都会指示 scanf 忽略任何和所有空格,直到扫描的项目。

scanf("%s")由于除 %c 和 %[ 之外的所有转换修饰符都会自动执行此操作,因此关于vs的原始问题的答案scanf(" %s")是没有区别。

我建议阅读 C 常见问题解答中的所有 scanf 问题并编写一些测试程序以更好地掌握所有内容:

http://c-faq.com/stdio/scanfprobs.html

于 2014-01-09T22:06:00.707 回答