我刚刚在大学上完第一堂 C 编程课,我这样做了:
#include <stdio.h>
int main()
{
char answer='x';
printf("Should the crocodile eat the man? y/n ");
scanf("%s",&answer);
printf("%s",& answer);
if(answer == 'y')
{printf("the man is dead");}
if(answer == 'n')
{printf("the man still alive ");}
}
如何对字符串而不是单个字符执行相同的操作?
我尝试了很多方法,但没有任何效果。
最佳答案
在 C 语言中,字符串是后跟零值终止符的字符值序列。字符串"hello"
由序列 {'h', 'e', 'l', 'l', 'o', 0}
表示.
字符串存储为 char
的数组- 数组必须足够大以容纳整个字符串加上 0 终止符,以便存储字符串 "hello"
,您需要一个 char
的数组至少 6 个元素长。
重要的是要记住 char
的数组没有包含字符串 - 您可以使用它来存储不被解释为字符串的字符数据。您还可以将多个字符串存储到一个数组中,如下所示:
/**
* Array size is determined by number of elements in the initializer
*/
char strs[] = {'T','h','i','s',0,'i','s',0,'a',0','t','e','s','t',0};
此后,strs
将包含 4 个字符串:"This"
, "is"
, "a"
, "test"
。
因此,存储字符串 "y"
或"n"
,您需要一个 char
的数组至少 2 个元素宽。
char answer[2];
使用 scanf
读取字符串,您使用 %s
转换说明符:
scanf( "%s", answer );
%s
告诉scanf
跳过任何前导空格,然后读取非空格字符的序列并将它们存储到 answer
大批。 0 终止符将自动附加到数组中,使其成为字符串。
在这种情况下,您不需要使用 &
运算符 answer
;在大多数情况下,“T
的数组”类型的表达式将转换(“衰减”)为“指向 T
的指针”类型的表达式,因此表达式 answer
从类型 char [2]
中“腐烂”输入char *
.
为了安全起见,您应该指定最大字段宽度,以便读取的字符数不会超过目标数组大小可容纳的字符数:
scanf( "%1s", answer );
由于我们必须为 0 终止符保留一个元素,因此字段宽度说明符应至少比目标数组的大小小 1。由于我们的目标数组大小可容纳 2 个元素,因此字段宽度说明符几乎必须为 1。
要比较字符串,请使用 strcmp
或strncmp
库函数:
if ( strcmp( answer, "y" ) == 0 )
{
// process "y" answer
}
是的,strcmp
匹配时返回 0。
您还可以对数组中的各个元素进行比较:
if ( answer[0] == 'y' )
{
// process "y" answer
}
记住
如果您想从输入流读取一个单个字符并将其存储到一个单个字符对象中 scanf
,您将使用 %c
转换说明符:
char answer; // single character, not an array
scanf( " %c", &answer ); // use & operator to obtain pointer, blank skips
// leading whitespace
如果您想从输入流中读取非空白字符的序列并将它们存储到char
的数组中与 scanf
,您将使用 %s
转换说明符:
char answer[2]; // array of character
scanf( "%1s", answer ); // do not use & operator to obtain pointer, array
// expressions are converted to pointer expressions
// automatically in this case.
关于c - 如何将 scanf 和 if 与字符串一起使用? (非常基础),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43335858/