我如何正确比较string?

我试图让一个程序让用户input一个单词或字符,存储它,然后打印出来,直到用户重新input,退出程序。 我的代码如下所示:

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

问题在于,即使用户的input(check)与原始input(input)匹配,我也不断获得inputstring的打印。 我比较两个不正确?

你不能(有用)比较使用!===string,你需要使用strcmp

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

这是因为!===只会比较这些string的基地址。 不是string本身的内容。

确定一些事情: gets是不安全的,应该用fgets(input, sizeof(input), stdin)replace,这样就不会发生缓冲区溢出。

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

还要注意的是,虽然在这个例子中它不会造成问题,但是fgets在缓冲区中存储换行符'\n' ; gets()不。 如果比较fgets()的用户input和string文字(比如"abc"它永远不会匹配(除非缓冲区太小,否则'\n'不适合)。

编辑:再次被超级快速的Mysticial殴打。

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

 array1==array2 

你应该逐字比较他们; 为此,您可以使用一个函数并返回一个布尔值(True:1,False:0)值。 然后你可以在while循环的testing条件下使用它。

尝试这个:

 #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库中,很受欢迎。 如果string相等,则strcmp返回0。 看到这个更好的解释什么strcmp返回。

基本上,你必须这样做:

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

要么

 while (!strcmp(check,input)) 

要么

 while (strcmp(check,input)) 

你可以检查这个 ,关于strcmp的教程。

每当你试图比较string,比较它们相对于每个字符。 为此,您可以使用内置的string函数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"); } 

不幸的是,你不能在<cstring>使用strcmp ,因为它是一个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; } 

我希望这能为你服务。