逐个字符比较 2 个字符串

标签 c string compare

我正在尝试编写一个程序,告诉我 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/

相关文章:

python - Python 中的未定义行为

c - 高斯消除的c中矩阵行列式核心倾倒误差

python - 如果两个字典的键相等,则使用两个值执行操作并移动到新字典(python)

java - 类型转换后的比较

c - 二维数组反转

c - 我需要用 C 解析一些月份名称

c - 用于字符串连接的 snprintf

C - 获取数字而不是字符串

string - 如何在源代码中跨多行编写单行字符串文字

prolog - swi-prolog 中的不相等操作