【发布时间】:2022-01-17 16:49:02
【问题描述】:
我有一个这种形式的结构:
typedef struct student{
double student_no;
char name[50];
char surname[50];
double phone_no;
char mail[50];
};
struct student person[100];
printf("Student's mail address: ");
scanf("%s", person[i].mail); //i use codeblocks and it works without the sign &
首先我创建了一个邮件数组。然后我收到用户的邮件,然后检查它是否在我最初创建的数组中。我必须在没有strcmp() 的情况下这样做,这就是我卡住的地方。到目前为止,这是我尝试过的:
char *e1, *e2;
int comp;
typedef struct info{
char email[50];
};
struct info mailaddress[0];
printf("Enter the mail address to search: ");
scanf("%s", mailaddress[0]);
for (int i = 0; i < u; i++) {
for (int j = i + 1; j < u; j++) {
e1 = person[i].mail;
e2 = mailaddress[j].email;
comp = 0;
while (*e1 && *e2) {
if (*e1 != *e2) {
comp = *e1 - *e2;
break;
}
++e1;
++e2;
}
if (comp == 0)
printf("%s\t %s %15.lf %15.lf %s\n",
person[i].name,
person[i].surname,
person[i].student_no,
person[i].phone_no,
person[i].mail);
}
}
【问题讨论】:
-
此声明 struct info mailaddress[0];无效 你不能声明一个元素为零的数组。
-
"我必须在没有 strcmp() 的情况下这样做" 了解
strcmp的工作原理,然后编写您自己的版本。 -
while(*e1 && *e2)应该使用||而不是&&,以便在字符串长度不同时它可以工作。如果字符串与最短字符串的长度相同,则较长的字符串将大于短字符串。 (这假设所有字符都有非负值。) -
我想强调 1.8e9 的评论。我推荐这个策略: 第 1 步。编写程序,使用
strcmp。 (是的,我知道,你不能这样做,但请耐心等待。)彻底调试你的程序,确保它在所有情况下都能正常工作。步骤 2. 编写您自己的strcmp版本,可能称为my_strcmp。它应该和标准版本一样,接受两个const char *参数,并返回一个int。第 3 步。(可选)编写一个单独的小程序来彻底测试您的my_strcmp。第 4 步。对第 1 步的程序进行简单更改以使用my_strcmp。