关于strcmp()程序的C代码有什么问题?

时间:2016-12-12 16:15:02

标签: c string c-strings strcmp

我正在编写一个程序来比较两个字符串而不使用strcmp()。但是,我无法得到我想要的结果。 这是我的程序的代码。

#include<stdio.h>
int main(int argc, char const *argv[]) {
   int i,j;
   char a[90],b[90];
   printf("Enter the first string:");
   scanf("%s", &a[90]);
   printf("Enter the second string:");
   scanf("%s", &b[90]);
   for ( i = 0; a[i] != '\0' && b[i] != '\0'; i++) {
      if (a[i] == b[i]) {
         /* code */
         printf("Equal %d \n", a[i]-b[i]);
continue;
      } if (a[i] > b[i]) {
         /* code */
         printf("ai is big %d \n", a[i]-b[i]);
         break;
      }
      if (a[i] < b[i]) {
         /* code */
         printf("%d bi is the biggest \n", a[i]-b[i]);
         break;
      }

   }


   return 0;
}

当我在终端中执行程序时,编译器接受输入字符串然后停止。我尝试了很多,但我无法弄清楚。任何人都可以帮助我......!

3 个答案:

答案 0 :(得分:7)

您的第一个数组的名称是a,而不是a[90]

同样,第二个数组的名称为b,而不是b[90]

表达式a[90]b[90]ab结尾后命名一个元素。

因此,通过编写&a[90]&b[90],您指示scanf在每个数组之后编写,这非常糟糕和错误。

您可能需要&a[0]&b[0]

但是,scanf非常危险,您根本不应该使用它。

答案 1 :(得分:0)

表达式'&amp; a [90]'和'&amp; b [90]'分别生成数组a和b中最后一个条目的地址。这意味着您正在将字符串读入未分配的堆栈内存,而不是读入数组。你需要在scanf()调用中使用普通的'a'和'b'。

如果您现在想知道“scanf如何知道将字符串限制为90个字符?”,答案绝对不会如此。 Scanf假定调用者已为输入的字符串提供了足够的缓冲区空间(包括终止null-char)。如果您确实需要能够输入任意长的字符串,则必须执行更复杂的缓冲区管理。如果您只想确保输入的字符少于90个,则需要下拉到一次获取一个字符(我相信您必须明确检查终止换行符)并计算它们以确保不会溢出缓冲区。

答案 2 :(得分:0)

有问题的代码存在一些问题。

问题

1-未使用的变量j

2-从用户获取字符串时,使用scanf a[90]b[90]表示字符串将从第90个数组索引中存储。这可能会导致一些内存问题,输出会有一些垃圾值。

最好在a[0]中使用b[0]scanf。我们可以在scanf中使用数组名称作为数组名称指向数组的起始地址。

scanf ("%s", a); 

scanf ("%s", b);

正确代码:

#include "stdio.h"

int main(int argc, char const *argv[]) 
{

        int i;
        char a[90],b[90];
        printf("Enter the first string:");
        scanf("%s", a);
        printf("Enter the second string:");
        scanf("%s", b);
        for ( i = 0; a[i] != '\0' || b[i] != '\0'; i++) {
                if (a[i] == b[i]) {
                        /* code */
                        printf("Equal %d \n", a[i]-b[i]);
                        continue;
                } if (a[i] > b[i]) {
                        /* code */
                        printf("a is big %d \n", a[i]-b[i]);
                        break;
                }
                if (a[i] < b[i]) {
                        /* code */
                        printf("%d b is the biggest \n", a[i]-b[i]);
                        break;
                }

        }
        return 0;
}