我如何正确比较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; }
我希望这能为你服务。