如何正确比较字符串?

时间:2011-11-04 02:22:27

标签: c string strcmp

我正在尝试让程序让用户输入单词或字符,存储它,然后将其打印出来,直到用户再次键入它,退出程序。我的代码如下所示:

#include <stdio.h>

int main()
{
    char input[40];
    char check[40];
    int i=0;
    printf("Hello!\nPlease enter a word or character:\n");
    gets(input);
    printf("I will now repeat this until you type it back to me.\n");

    while (check != input)
    {
        printf("%s\n", input);
        gets(check); 
    }

    printf("Good bye!");


    return 0;
}

问题是我一直打印输入字符串,即使用户输入(检查)与原始输入(输入)匹配也是如此。我不正确地比较这两个吗?

11 个答案:

答案 0 :(得分:243)

您无法(有用)使用!===比较字符串,您需要使用strcmp

while (strcmp(check,input) != 0)

原因是!===只会比较这些字符串的基地址。不是字符串本身的内容。

答案 1 :(得分:30)

好的一些事情:gets不安全,应该用fgets(input, sizeof(input), stdin)替换,这样就不会出现缓冲区溢出。

接下来,要比较字符串,必须使用strcmp,其中返回值0表示两个字符串匹配。使用相等运算符(即!=)比较两个字符串的地址,而不是它们中的单个char

并且还要注意,虽然在此示例中它不会导致问题,fgets也会将换行符'\n'存储在缓冲区中; gets()没有。如果您将来自fgets()的用户输入与字符串文字(例如"abc")进行比较,它将永远不会匹配(除非缓冲区太小,以致'\n'不适合它)。

编辑:再次被超级快速的神秘主义者击败。

答案 2 :(得分:8)

使用strcmp

这是在string.h库中,非常受欢迎。如果字符串相等,则strcmp返回0。有关strcmp返回的更多说明,请参阅this

基本上,你必须这样做:

while (strcmp(check,input) != 0)

while (!strcmp(check,input))

while (strcmp(check,input))

您可以查看strcmpFindIndex上的教程。

答案 3 :(得分:7)

你不能像这样直接比较数组

array1==array2

你应该比较char-by-char;为此,您可以使用函数并返回布尔值(True:1,False:0)。然后你可以在while循环的测试条件下使用它。

试试这个:

#include <stdio.h>
int checker(char input[],char check[]);
int main()
{
    char input[40];
    char check[40];
    int i=0;
    printf("Hello!\nPlease enter a word or character:\n");
    scanf("%s",input);
    printf("I will now repeat this until you type it back to me.\n");
    scanf("%s",check);

    while (!checker(input,check))
    {
        printf("%s\n", input);
        scanf("%s",check);
    }

    printf("Good bye!");

    return 0;
}

int checker(char input[],char check[])
{
    int i,result=1;
    for(i=0; input[i]!='\0' || check[i]!='\0'; i++) {
        if(input[i] != check[i]) {
            result=0;
            break;
        }
    }
    return result;
}

答案 4 :(得分:1)

每当您尝试比较字符串时,请将它们与每个字符进行比较。为此你可以使用内置的字符串函数strcmp(input1,input2);你应该使用名为#include<string.h>

的头文件

试试这段代码:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h>  

int main() 
{ 
    char s[]="STACKOVERFLOW";
    char s1[200];
    printf("Enter the string to be checked\n");//enter the input string
    scanf("%s",s1);
    if(strcmp(s,s1)==0)//compare both the strings  
    {
        printf("Both the Strings match\n"); 
    } 
    else
    {
        printf("Entered String does not match\n");  
    } 
    system("pause");  
} 

答案 5 :(得分:0)

不幸的是,您无法使用strcmp中的<cstring>,因为它是一个C ++标头,您明确表示它适用于C应用程序。我有同样的问题,所以我必须编写自己的函数来实现strcmp

int strcmp(char input[], char check[])
{
    for (int i = 0;; i++)
    {
        if (input[i] == '\0' && check[i] == '\0')
        {
            break;
        }
        else if (input[i] == '\0' && check[i] != '\0')
        {
            return 1;
        }
        else if (input[i] != '\0' && check[i] == '\0')
        {
            return -1;
        }
        else if (input[i] > check[i])
        {
            return 1;
        }
        else if (input[i] < check[i])
        {
            return -1;
        }
        else
        {
            // characters are the same - continue and check next
        }
    }
    return 0;
}

我希望这对你有好处。

答案 6 :(得分:0)

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char s1[50],s2[50];
        printf("Enter the character of strings: ");
        gets(s1);
        printf("\nEnter different character of string to repeat: \n");
        while(strcmp(s1,s2))
        {
            printf("%s\n",s1);
            gets(s2);
        }
        return 0;
    }

这是一个非常简单的解决方案,您可以根据需要获得输出。

答案 7 :(得分:0)

  

如何正确比较字符串?

char input[40];
char check[40];
strcpy(input, "Hello"); // input assigned somehow
strcpy(check, "Hello"); // check assigned somehow

// insufficient
while (check != input)

// good
while (strcmp(check, input) != 0)
// or 
while (strcmp(check, input))

让我们更深入地了解为什么check != input还不够

在C语言中, string 是标准库规范。

  

string 是连续的字符序列,以第一个空字符结尾并包含第一个空字符。
  C11§7.1.11

上面的

input不是字符串inputarray 40 of char

input的内容可以成为 string

在大多数情况下,在表达式中使用数组时,会将其转换为其第一个元素的地址。

下面将checkinput转换为它们各自的第一个元素的地址,然后将这些地址进行比较。

check != input   // Compare addresses, not the contents of what addresses reference

要比较字符串,我们需要使用这些地址,然后查看它们指向的数据。
strcmp()完成工作。 §7.23.4.2

  

int strcmp(const char *s1, const char *s2);

     

strcmp函数将s1指向的字符串与s2指向的字符串进行比较。

     

strcmp函数返回一个大于,等于或小于零的整数,   因此,s1指向的字符串大于,等于或小于s2指向的字符串。

代码不仅可以找到字符串是否具有相同的数据,而且还可以发现字符串不同时哪个更大/更少。

当字符串不同时,以下内容为真。

strcmp(check, input) != 0

有关见解,请参见Creating my own strcmp() function

答案 8 :(得分:0)

欢迎使用 pointer 的概念。一代又一代的程序员发现这个概念难以捉摸,但是,如果您希望成长为一个有能力的程序员,则必须最终掌握这一概念-而且,您已经在问正确的问题。很好。

您是否清楚地址是什么?参见下图:

----------     ----------
| 0x4000 |     | 0x4004 |
|    1   |     |    7   |
----------     ----------

在图中,整数1存储在内存中的 address 0x4000处。为什么要在一个地址?由于内存很大并且可以存储许多整数,因此城市很大并且可以容纳许多家庭。每个整数都存储在一个内存位置,因为每个家庭都住在一所房子里。每个存储位置都由一个地址标识,因为每个房屋都由一个地址标识。

图中的两个框代表两个不同的内存位置。您可以将它们视为房屋。整数1驻留在地址0x4000的存储位置中(例如,“ 4000 Elm St.”)。整数7驻留在地址0x4004的存储位置中(例如,“ 4004 Elm St。”)。

您认为您的程序正在将1与7进行比较,但事实并非如此。它正在比较0x4000和0x4004。那么当您遇到这种情况时会发生什么?

----------     ----------
| 0x4000 |     | 0x4004 |
|    1   |     |    1   |
----------     ----------

两个整数相同,但地址不同。您的程序将比较地址。

答案 9 :(得分:0)

您需要使用 TypeError: null is not an object (evaluating '_reactNativeContactsWrapper.default.getContact') 并且您需要 strcmp()

#include <string.h>!= 运算符仅比较这些字符串的基地址。不是字符串的内容

==

示例代码:

while (strcmp(check, input))

注意 1:#include <stdio.h> #include <string.h> int main() { char input[40]; char check[40] = "end\n"; //dont forget to check for \n while ( strcmp(check, input) ) //strcmp returns 0 if equal { printf("Please enter a name: \n"); fgets(input, sizeof(input), stdin); printf("My name is: %s\n", input); } printf("Good bye!"); return 0; } 是不安全的。改用gets()

注意 2:使用 fgets() 时,您还需要检查 fgets() 换行符

答案 10 :(得分:0)

您可以:

使用 strcmp() 中的 string.h,这是更简单的版本

或者,如果你想推出自己的,你可以使用这样的东西:

int strcmp(char *s1, char *s2)
{
    int i;
    while(s1[i] != '\0' && s2[i] != '\0')
    {
        if(s1[i] != s2[i])
        {
            return 1;
        }
        i++;
    }
    return 0;
}

我会像这样使用 strcmp()

while(strcmp(check, input))
{
    // code here
}