关于 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]
在a
和b
之后命名一个元素。
所以,通过写 &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;
}
我正在编写一个不使用 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]
在a
和b
之后命名一个元素。
所以,通过写 &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;
}