scanf中的空格是什么意思? #包括 int main(int argc,char*argv[]){ 字符c; scanf(“%c”、&c); printf(“%c\n”,c); 返回0; } [root@test]#/加拿大 A. A. [root@test]#/加拿大 H H
空间是否存在似乎总是匹配的,为什么 格式字符串中的空白(如空格、制表符或换行符)与输入中的任意空白量相匹配,包括无scanf中的空格是什么意思? #包括 int main(int argc,char*argv[]){ 字符c; scanf(“%c”、&c); printf(“%c\n”,c); 返回0; } [root@test]#/加拿大 A. A. [root@test]#/加拿大 H H,c,scanf,C,Scanf,空间是否存在似乎总是匹配的,为什么 格式字符串中的空白(如空格、制表符或换行符)与输入中的任意空白量相匹配,包括无 scanf格式中的空格表示从当前位置开始“跳过所有空白”。由于大多数scanf格式说明符在尝试读取任何内容之前都会跳过所有空格,因此大多数情况下在scanf格式中不会使用空格。但是,当您使用不忽略空白的格式说明符时,在必要时(强制跳过)在格式中包含空格可能是有意义的 不忽略空白的说明符是c[和n。因此,在其中一个说明符前面指定一个空格会产生影响。否则,它不会产生任何影响。在您的特定
scanf
格式中的空格表示从当前位置开始“跳过所有空白”。由于大多数scanf
格式说明符在尝试读取任何内容之前都会跳过所有空格,因此大多数情况下在scanf
格式中不会使用空格。但是,当您使用不忽略空白的格式说明符时,在必要时(强制跳过)在格式中包含空格可能是有意义的
不忽略空白的说明符是c
[
和n
。因此,在其中一个说明符前面指定一个空格会产生影响。否则,它不会产生任何影响。在您的特定示例中,空白会被忽略,因为您在scanf
格式中使用了空格(因为您正在使用%c
)。请尝试删除空格,看看会发生什么情况。空格仅表示接受空格作为输入。您可能需要阅读有关使用scanf而不是fgets的危险的文章
格式字符串中的空白字符将忽略输入中的0个或多个空白字符,直到第一个非空白字符。表示:
由一个或多个空白字符组成的指令应通过读取输入来执行,直到无法读取更多有效输入,或直到第一个字节(非空白字符,未读取)为止
而且
除非转换规范包含[、c、c或n转换说明符,否则应跳过输入的空格字符(由isspace指定)
这意味着需要格式字符串中的空间。但是,如果要读取整数,则该空间将是多余的:
#include <stdio.h>
int main(int argc, char* argv[]) {
char c;
scanf(" %c", &c);
printf("%c\n", c);
return 0;
}
[root@test]# ./scanf
a
a
[root@test]# ./scanf
h
h
%c不会像数字格式说明符那样跳过空格字符。
因此,如果您使用:
/* equivalent statements */
scanf(" %d %d %d", &v1, &v2, &v3);
scanf("%d%d%d", &v1, &v2, &v3);
但这被认为是非常糟糕的编程,因为C标准规定了未定义的fflush(stdin)行为。
因此,除非您有特定的理由捕获空白,否则请始终在格式字符串中使用空格。,GIYF@JeRog:它与“键”不匹配。它与输入字符匹配。换行符被视为空白,所以是的,它将跳过换行符。是的,空格可以用来匹配“换行符”。请注意,在Windows中单击RETURN时,它通常会发送“\r\n”,而在Linux中仅发送“\n”。但对于简单的数字输入扫描,这通常并不重要,因为数字转换将在其到达非数字时立即停止(根据扫描的输入类型,允许使用
-
和+
)如果\r
和\n
都是空白,为什么我需要小心呢?@hexa:fscanf
用于文本流。在文本流中,无论是Linux还是Windows,文本流都不重要,因为文本流在运行之前会自动将特定于平台的行尾标记转换为任何平台上的单个'\n'
有机会访问fscanf
。这只是在处理用户输入时需要注意的一个警告。在这种情况下,这并不重要。
#include<stdio.h>
int main(int argc, char* argv[]){
char c;
scanf("%c", &c);
printf("%c\n", c);
scanf("%c", &c); // Try running with and without space
printf("%c\n", c);
return 0;
}
fflush(stdin);
scanf("%c" &c);