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

What is wrong in my C code for a program about 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] != '[=10=]' && b[i] != '[=10=]'; 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;
}

当我在终端中执行程序时,编译器获取输入字符串然后停止。我尝试了很多,但无法弄清楚。谁能帮帮我...!

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

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

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

所以,通过写 &a[90]&b[90] 你是在指示 scanf 在 每个数组之后写 ,这是非常糟糕的错了。

您可能是指 &a[0]&b[0]

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

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

如果您现在想 "How does scanf know to limit the strings to 90 characters?",答案是永远不会。 Scanf 假定调用者已为输入的字符串(包括终止空字符)提供了足够的缓冲区 space。如果你真的需要能够输入任意长的字符串,你将不得不执行更复杂的缓冲区管理。如果您只想确保输入的字符少于 90 个,则需要下降到一次获取一个字符(我相信您必须明确检查终止换行符)并计算它们以确保您不会缓冲区溢出。

给定的相关代码存在问题。

问题

1- 未使用的变量 j.

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

scanf中使用a[0]b[0]很好。我们可以在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] != '[=11=]' || b[i] != '[=11=]'; 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;
}