c-逐字符比较2个字符串



我正在尝试编写一个程序,该程序告诉我两个字符串是否相同。如果他们有一个不同的chracter,他们就不是。

我有这个代码,但它不起作用,为什么?

#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个不完全相同的字符串时,它什么也不返回。(当我引入两个相同的字符串时,也会发生同样的情况,但应该是这样的)

我该怎么修?

这里有一个重要的错误。首先:经典的"c样式字符串"以null结尾。尽管还有其他选择(比如将长度存储在字符串之外),但以null结尾的字符串是语言(因为代码中的字符串文字由编译器以null结尾)和运行库(大多数字符串函数处理字符串末尾的\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是最基本的一个,只有两个字符*:

strncmp允许指定要比较的最大字符数,并比较字符串的一部分:

还有其他,只需查看链接即可。

请注意,最好使用库函数,因为即使在这样一个"简单"的函数中。有一些优化的方法可以比较字符串。比如用母语单词大小进行比较。在32位平台上,比较的时间要多花四倍,这还不包括执行字节操作所需的掩码。

您的for循环是:

for (i=0;str1[i]==str2[i];i++)
if (str1[i]!=str2[i]){
printf("They are not identical");
}
else continue;

假设str1"abc"str2"xyz"

对于i = 0for循环中的条件将计算为false。因此,你永远不会得到这样的陈述:

if (str1[i]!=str2[i]){

因此,您永远不会执行:

printf("They are not identical");

您可以使用修复逻辑错误

for (i=0; str1[i] != '' && str2[i] != ''; i++)
{
if (str1[i]!=str2[i]) {
break;
}
}
// If at end of the loop, we have reached the ends 
// of both strings, then they are identical. If we
// haven't reached the end of at least one string,
// then they are not identical.
if ( str1[i] != '' || str2[i] != '' )
{
printf("They are not identical");
}

我有这个代码,但它不起作用,为什么因为循环条件str1[i]==str2[i]将使内部if条件始终为false。

我该怎么做才能修复它简单代码:

for ( i=0; str1[i]==str2[i] && str1[i]!=''; i++) {
}
if ( str1[i]!=str2[i] ) {
printf("They are not identical");
}

i=0;
while ( str1[i]==str2[i] && str1[i]!='' ) {
i++;
}
if ( str1[i]!=str2[i] ) {
printf("They are not identical");
}

假设您有两个字符串,其中第一个字符不同。则您将不会进入循环,因为循环的条件(str1[i]=str2[i])失败,因此条件应为(str1[i]!='\0'&str2[i]!='\0')。"\0"是c样式字符串的最后一个字符。您还可以使用字符串内置函数,如"strcmp(str1,str2)"。

相关内容

  • 没有找到相关文章