c - 如何将 scanf 和 if 与字符串一起使用? (非常基础)

标签 c string scanf

我刚刚在大学上完第一堂 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。

要比较字符串,请使用 strcmpstrncmp库函数:

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/

相关文章:

c++ - 检查 string.at(i) 是否为空白 C++

c++ - 在c++中将长双文字后缀附加到用户输入

c - 是否可以在接受事件时执行 epoll?

C 在函数中传递指针到指针

C - 创建一个查找表,将数据返回到 union : either a bitwise struct or a short

c++ - 不理解 sscanf_s 行为

c++ - 使用 fscanf 时将宽度作为变量

c - 如何设计金盒游戏的策略和算法

c - 使用两个数组输出字符串 - C

java - 在 Java 中连接到 null 变量会产生意外结果