我正在尝试编写一个程序,告诉我 2 个字符串是否相同。如果他们有一种不同的性格,他们就不是。
我有这段代码,但它不起作用,为什么?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
char str1[30], str2[30];
int i;
printf("\nEnter two strings :");
gets(str1);
gets(str2);
for (i=0;str1[i]==str2[i];i++)
if (str1[i]!=str2[i]){
printf("They are not identical");
}
else continue;
return (0);
}
它编译时出现 0 个错误和 0 个警告,但是当我引入 2 个不相同的字符串时,它什么也不返回。 (当我引入 2 个相同的字符串时会发生同样的情况,但这是应该的)
我应该怎么做才能修复它?
最佳答案
这里有一件重要的错误。首先:经典的“c 风格字符串”是空终止的。尽管还有其他选择(比如将长度存储在字符串之外),以空字符结尾的字符串是语言的一部分(因为代码中的字符串文字由编译器以空字符结尾),而运行时库(大多数字符串函数处理\0 在字符串的末尾)。
gets 还会在输入的字符串末尾附加一个\0: http://www.cplusplus.com/reference/cstdio/gets/
您不仅要比较输入的字符串,还要比较内存中该字符串之后的任何内容(随机)。
它应该是这样的:
for(int i=0;str1[i]==str2[i];i++){
if(str1[i]==0) {
printf("equal");
}
}
printf("not equal");
还有其他选择,比如使用指针。但在现代编译器上,它们应该生成大致相同的机器代码。
请注意,有一些 C 运行时库函数可以比较字符串:
strcmp是最基本的,就两个char *:
strncmp 允许指定要比较的最大字符数,只比较字符串的一部分:
还有其他的,请查看链接。
请注意,最好使用库函数,因为即使在这样一个“简单”的函数中。有优化的方法来比较字符串。就像比较原生字的大小。在 32 位平台上,您花费四倍多的时间进行比较,不包括执行字节操作所需的掩码。
关于逐个字符比较 2 个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37621806/