我正在编写一个程序来比较两个字符串而不使用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;
}
当我在终端中执行程序时,编译器接受输入字符串然后停止。我尝试了很多,但我无法弄清楚。任何人都可以帮助我......!
答案 0 :(得分:7)
您的第一个数组的名称是a
,而不是a[90]
。
同样,第二个数组的名称为b
,而不是b[90]
。
表达式a[90]
和b[90]
在a
和b
结尾后命名一个元素。
因此,通过编写&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;
}