在 C 中,字符串 是一系列字符值,后跟一个零值终止符。字符串"hello"由序列{'h', 'e', 'l', 'l', 'o', 0}表示。
字符串存储为char的数组 - 数组必须足够大以容纳整个字符串加上 0 终止符,以便存储字符串@987654324 @,您需要一个由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",您需要一个 至少 2 个元素宽的 char 数组。
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
}
记住
如果您想从输入流中读取 single 字符并将其存储到带有 scanf 的 single 字符对象中,则可以使用 %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.