如何正确比较C中的字符串?

我试图得到一个程序,让用户输入一个单词或字符,存储它,然后打印它,直到用户再次键入它,退出程序。我的代码是这样的:

#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);   /* obsolete function: do not use!! */
printf("I will now repeat this until you type it back to me.\n");


while (check != input)
{
printf("%s\n", input);
gets(check);   /* obsolete function: do not use!! */
}


printf("Good bye!");
    



return 0;
}

问题是,我一直得到输入字符串的打印,即使当用户的输入(检查)匹配原始(输入)。我把两者比较错了吗?

600307 次浏览

你不能(有用地)使用!===比较字符串,你需要使用strcmp:

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

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

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

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

还要注意,虽然在这个例子中它不会引起问题,但fgets存储换行符,'\n'也在缓冲区中;gets()没有。如果你比较用户输入的fgets()和字符串文字,比如"abc",它永远不会匹配(除非缓冲区太小,以至于'\n'无法放入)。

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

array1==array2

你应该一个字符一个字符地比较;为此,你可以使用一个函数并返回一个布尔值(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;
}

使用strcmp

它位于string.h库中,非常流行。strcmp如果字符串相等则返回0。有关strcmp返回内容的更好解释,请参见

基本上,你需要做的是:

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

while (!strcmp(check,input))

while (strcmp(check,input))

你可以查看,一个关于strcmp的教程。

当您尝试比较字符串时,请将它们与每个字符进行比较。为此,你可以使用内置的字符串函数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");
}
    #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;
}

这是一个非常简单的解决方案,你可以得到你想要的输出。

我如何正确比较字符串?

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语言中,字符串是一个标准库规范。

字符串是一个连续的字符序列,以第一个空字符结束并包括第一个空字符 C11§7.1.1 1

上面的input不是字符串input40字符数组

input的内容可以变成字符串

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

下面的代码将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

详见创建自己的strcmp()函数

欢迎来到指针。的概念,一代又一代的程序员都发现这个概念难以捉摸,但如果你希望成长为一个称职的程序员,你必须最终掌握这个概念。而且,你已经问对了问题。这很好。

你清楚什么是地址了吗?请看这个图表:

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

在图中,整数1存储在内存中的地址 0x4000处。为什么在一个地址?因为内存很大,可以存储很多整数,就像一个城市很大,可以容纳很多家庭一样。每个整数存储在一个内存位置,就像每个家庭居住在一个房子里一样。每个内存位置由地址标识,就像每个房子由一个地址标识一样。

图中的两个框表示两个不同的内存位置。你可以把它们想象成房子。整数1驻留在地址为0x4000的内存位置(想象一下,“4000 Elm St.”)。整数7驻留在地址为0x4004的内存位置(想象一下,“4004 Elm St.”)。

你以为你的程序在比较1和7,但它不是。它在比较0x4000和0x4004。当你遇到这种情况时会发生什么?

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

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

你需要使用strcmp()#include <string.h>

!===操作符只比较这些字符串的基址。不是字符串的内容

while (strcmp(check, input))

示例代码:

#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;
}

注1:gets()是不安全的。请改用fgets()

注2:当使用fgets()时,你也需要检查'\n'换行符

您可以:

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

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

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
}