比较字符2字符串

时间:2016-06-03 19:11:13

标签: c string compare

我正在尝试编写一个程序,告诉我2个字符串是否为identcal。如果他们有一个不同的字符他们不是。

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

#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个相同的字符串时会发生同样的情况,但这应该是怎样的)

我该怎么办才能修复它?

4 个答案:

答案 0 :(得分:1)

您的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"

for循环中的条件将i = 0评估为false。因此,你永远不会得到声明:

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

因此,您永远不会执行:

     printf("They are not identical");

您可以使用以下方法修复逻辑错误:

for (i=0; str1[i] != '\0' && str2[i] != '\0'; 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] != '\0' || str2[i] != '\0' )
{
   printf("They are not identical");
}

答案 1 :(得分:1)

这里有一个重要的错误。首先:经典的“c style string”以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是最基本的,只有两个char *:

strncmp允许指定要比较的maximium字符,比较字符串的一部分:

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

请注意,最好使用库函数,因为即使在这样的“简单”函数中也是如此。有优化的方法来比较字符串。喜欢比较原生单词大小。在32位平台上,您将花费四倍的时间进行比较,不包括执行字节操作所需的屏蔽。

答案 2 :(得分:1)

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

我该怎么办才能修复它? 简单的代码:

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

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

答案 3 :(得分:0)

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