使用strcmp比较C中的字符串

使用strcmp比较C中的字符串,c,string,C,String,我正试图学习用C编程,但在处理字符串时遇到了麻烦,因为C将字符串视为数组 我的目标是制作一个程序来存储用户的名字和姓氏 以下是我的进展: #include <stdio.h> int main(int argc, const char * argv[]) { //defining the variables char first_name[100]; char surname[100]; char ch[2]; // Asking for the first name and

我正试图学习用C编程,但在处理字符串时遇到了麻烦,因为C将字符串视为数组

我的目标是制作一个程序来存储用户的名字和姓氏

以下是我的进展:

#include <stdio.h>

int main(int argc, const char * argv[]) {

//defining the variables
char first_name[100];
char surname[100];
char ch[2];


// Asking for the first name and storing it
printf("What's your first name?\n");
scanf("%s", first_name);

// Prints the first name
printf("Hey %s!\n",first_name);


//Asks the user if they want to store their surname
printf("Would you like to tell me your second name? This is optional so type 'Y' for yes and 'N' for no.\n");
scanf("%s", ch);

//validate if they want to store it or not
if (ch == "Y"){
    printf("What is your surname?\n");
    scanf("%s", surname);
    printf("Your whole name is %s %s", first_name, surname);
 }

return (0);
}
但是,变量
ch
不是文字,因此不可比较

旁注

我也尝试过比较两种文字,只是想看看它是如何工作的:

char *hello = "Hello";
char *Bye = "Bye";


if (strcmp(hello, Bye)){
    printf("What is your surname?\n");
    scanf("%s", surname);
    printf("Your whole name is %s %s", first_name, surname);
}
但即使这样,也出现了一个错误:

Implicitly declaring library function 'strcmp' with type 'int (const *char, const *char)'

我相信由于缺乏经验,我无法做到这一点,因此如果您能帮助我了解我做错了什么,以及如何解决问题,我将不胜感激。

您需要包括适当的标题:

#include <string.h>
而不是:

if (strcmp(hello, Bye))

因为strcmp在相等的情况下返回0。

您需要包括适当的标题:

#include <string.h>
而不是:

if (strcmp(hello, Bye))

因为strcmp在相等的情况下返回0。

这里有两个问题。首先,您需要查看strcmp返回的值,其次,您必须使用适当的hedder

您必须使用:

#include <string.h>

之所以这样做,是因为如果ch小于“Y”,strcmp函数返回负值;如果ch大于“Y”,则返回正值;如果两个字符串相等,则返回0。

这里有两个问题。首先,您需要查看strcmp返回的值,其次,您必须使用适当的hedder

您必须使用:

#include <string.h>

之所以这样做,是因为如果ch小于“Y”,strcmp函数将返回负值;如果ch大于“Y”,strcmp函数将返回正值;如果两个字符串相等,strcmp函数将返回0。

关于如何使用scanf处理输入,您应该纠正几个问题。首先,始终通过检查
scanf
return
来验证预期的成功转换次数。接下来,如注释中所述,无需在代码中包含
,即可进行一个字母的比较。使用字符比较而不是字符串比较。最后,始终将输入限制为可用字符数(加上nul终止字符)

将这些位放在一起,您可以执行以下操作:

#include <stdio.h>

#define MAXN 100

int main (void) {

    char first_name[MAXN] = "", surname[MAXN] = "";
    int ch;

    printf ("What's your first name?: ");
    if (scanf ("%99[^\n]%*c", first_name) != 1) {
        fprintf (stderr, "error: invalid input - first name.\n");
        return 1;
    }
    printf ("Hey %s!\n", first_name);

    printf("Enter surname name? optional (Y/N) ");
    if (scanf("%c%*c", (char *)&ch) != 1) {
        fprintf (stderr, "error: invalid input - Y/N\n");
        return 1;
    }

    if (ch != 'y' && ch != 'Y')     /* handle upper/lower case response */
        return 1;

    printf ("Enter your surname?: ");
    if (scanf (" %99[^\n]%*c", surname) != 1) {
        fprintf (stderr, "error: invalid input - surname\n");
        return 1;
    }

    printf ("\nYour whole name is : %s %s\n", first_name, surname);

    return 0;
}

如果您有任何问题,请查看并告诉我。

关于如何使用
scanf
处理输入,您应该纠正几个问题。首先,始终通过检查
scanf
return
来验证您期望的成功转换次数。接下来,如注释中所述,有N个问题O需要在代码中包含
以进行单字母比较。使用字符比较而不是字符串比较。最后,始终将输入限制为可用字符数(加上nul终止字符)

将这些位放在一起,您可以执行以下操作:

#include <stdio.h>

#define MAXN 100

int main (void) {

    char first_name[MAXN] = "", surname[MAXN] = "";
    int ch;

    printf ("What's your first name?: ");
    if (scanf ("%99[^\n]%*c", first_name) != 1) {
        fprintf (stderr, "error: invalid input - first name.\n");
        return 1;
    }
    printf ("Hey %s!\n", first_name);

    printf("Enter surname name? optional (Y/N) ");
    if (scanf("%c%*c", (char *)&ch) != 1) {
        fprintf (stderr, "error: invalid input - Y/N\n");
        return 1;
    }

    if (ch != 'y' && ch != 'Y')     /* handle upper/lower case response */
        return 1;

    printf ("Enter your surname?: ");
    if (scanf (" %99[^\n]%*c", surname) != 1) {
        fprintf (stderr, "error: invalid input - surname\n");
        return 1;
    }

    printf ("\nYour whole name is : %s %s\n", first_name, surname);

    return 0;
}

如果您有任何问题,请仔细查看并告诉我。

您应该做的第一件事是阅读。这将告诉您需要
#包含
。它还将告诉您
strcmp
在字符串匹配时返回0。哦,是的,我忘了!我会立即阅读:)@kaylum“然而,变量ch不是一个文字,因此不可比较”。你怎么会这么认为?
strcmp
可以比较变量中包含的字符串。或者,将
int ch
作为单个字符读取。然后你可以进行简单的比较
if(ch='Y')
(注意:您将阅读到您使用scanf的方式存在的问题)你解决了它,我需要包含字符串.h库。愚蠢的错误。你应该做的第一件事是阅读。这会告诉你你需要
#include
。它还会告诉你当字符串匹配时,
strcmp
返回0。哦,是的,我忘了!我马上读:)@kaylum”但是变量ch不是一个文字,因此不可比较”。你怎么会这么认为?
strcmp
可以比较变量中包含的字符串。或者,将
int ch
作为单个字符读取。然后你可以进行简单的比较
if(ch='Y')
(注意:您将阅读到您使用scanf的方式存在的问题)你解决了它,我需要包含字符串.h库。愚蠢的错误。谢谢,你完全正确!我也添加了一个答案,因为我觉得它更简洁。看一看,告诉我如何提高我的回答技能谢谢,你完全正确!我也添加了一个答案,因为我觉得它更简洁。看一看它告诉我如何提高我的回答能力这很有趣但很高级。当我对自己的能力更有信心时,我一定会回顾这一点!谢谢你的意见:)好的,好的,实际上它是基本的。您可以提示输入名字,读取/验证响应。
scanf
格式说明符
%99[^\n]%*c
是读取带空格的字符串并将字符数限制为
99+num终止字符
所需的最小值。
%*c
只是读取/丢弃您将留在输入缓冲区(
stdin
)中的
'\n'
,这将在下次调用
scanf
时引起问题。(这就是为什么
fgets
getline
通常比
scanf
更受欢迎的原因。请仔细理解这里的每个字符——它是最基本的字符。这非常有趣但很高级。当我对自己的能力更有信心时,我一定会回顾这一点!谢谢您的输入:)嗯,好的,实际上它是基本的。您可以提示输入名字,读取/验证响应。
scanf
格式说明符
%99[^\n]%*c
是读取带空格的字符串并将字符数限制为
99+nul终止字符所需的最小值