使用%c或%s扫描

使用%c或%s扫描,c,arrays,char,scanf,format-specifiers,C,Arrays,Char,Scanf,Format Specifiers,我必须为大学做一个项目,在这个项目中,我应该在一定数量的人之间,把喜欢某样东西的人和不喜欢某样东西的人分开。 所以我这样做了: char like[100]; printf("Like? Y or N \n"); scanf ("%c", like); 程序已编译,但没有按应有的方式运行。当被问到“喜欢”时,用户不能写“y或n” 所以我试了一下: char like[100]; printf("Like? Y or N \n"); scanf

我必须为大学做一个项目,在这个项目中,我应该在一定数量的人之间,把喜欢某样东西的人和不喜欢某样东西的人分开。 所以我这样做了:

    char like[100];

    printf("Like? Y or N \n");
    scanf ("%c", like);
程序已编译,但没有按应有的方式运行。当被问到“喜欢”时,用户不能写“y或n”

所以我试了一下:

    char like[100];

    printf("Like? Y or N \n");
    scanf ("%s", like);

它成功了。但我不知道为什么它会起作用。有人能给我解释一下
%c
%s
scanf
中的区别吗?

%s用于字符串并读取后续字符,直到找到空白(空白、换行或制表符)。而%c用于单个字符并读取下一个字符。如果有超过1个字符,包括任何空白字符,则在下一次迭代中读取并存储该字符

首先,请在来这里之前做一些基础研究——像这样的问题通常可以通过快速的谷歌搜索或查看手边的C参考手册来回答

char inputChar;              // stores a single character
char inputString[100] = {0}; // stores a string up to 99 characters long

scanf( " %c", &inputChar );  // read the next non-whitespace character into inputChar
//            ^ Note & operator in expression
scanf( "%s", inputString );  // read the next *sequence* of non-whitespace characters into inputString
//           ^ Note no & operator in expression
当您想从输入流中读取单个字符并将其存储到
char
对象时,可以使用
%c
%c
转换说明符不会跳过任何前导空格,因此,如果要读取下一个非空格字符,则需要在格式字符串中的
%c
说明符前加一个空格,如上所示

如果要从输入流中读取一系列非空白字符并将其存储到
字符数组中,可以使用
%s
。目标数组必须足够大,以存储输入字符串和终止的0值字符。
%s
转换说明符跳过任何前导空格,并在非空格字符后的第一个空格字符处停止读取

%c
%s
都希望它们相应的参数具有类型
char*
(指向
char
)的指针;但是,在第一种情况下,假定指针指向单个对象,而在第二种情况下,假定指针指向数组的第一个元素。对于
inputChar
,我们必须使用一元
&
运算符来获取指针值。对于
inputString
,我们不这样做,因为在大多数情况下,“array of
t
”类型的表达式将被转换为“pointer to
t
”类型的表达式,表达式的值将是数组第一个元素的地址

您的代码工作正常,但读取单个字符并将其存储到数组中有点混乱

使用
%s
而没有明确的字段宽度是有风险的;如果有人输入超过100个非空白字符,
scanf
会很高兴地在
inputString
之后将这些额外的字符存储到内存中,这可能会破坏一些重要的内容。写这样的东西通常比较安全

scanf( "%99s", inputString ); // reads no more than 99 characters into inputString
或者使用
fgets()
读取输入字符串:

fgets( inputString, sizeof inputString, stdin );  

有关
*scanf
功能的所有转换说明符的完整说明,请查看C语言标准第7.21.6.2节

这个发现花了我大约10秒钟的时间,请尝试在求助于提问之前做一些研究,这也会节省你的时间!:-)<代码>%s
跳过前导空格字符,而
%c
不跳过前导空格字符。在您的代码中,您的标准输入流(
stdin
)中有一个由上一个
scanf
留下的尾随
\n
字符<代码>%s跳过它,并等待进一步的非空白输入<代码>%c使用
\n
并且不等待进一步的输入。“该程序已编译,但没有按它应该的方式工作。”为什么?“没有按应有的方式工作”是什么意思?第一个程序没有问题。他们两个都会工作。不过,每种方法都有自己的特点。简单的谷歌搜索格式说明符可能会给你更好的答案。Google和duck duck go是您的朋友
%s
跳过前导空格,一旦扫描在空格处停止,并在扫描的字符后写入空终止符<代码>%c不跳过空白,除非给出更大的宽度,否则只读取一个字符,并且不写入空终止符。文档(手册页等)解释了这些内容。谢谢你。我想,由于我希望只接收“y”或“n”来填充我的数组,所以我应该使用scanf和%c