是的,我知道这个问题已被多次提出,但这些都没有帮助我发现问题(重复......是的)。我想从输入中读取一系列字符串到一个数组中,然后从' First Name'中搜索。如果名称存在,我想显示存储在该数组元素中的所有数据(我很容易将代码附加到不存在)。当我运行它时,我从键盘读取所有数据,但它绝对没有给我回报。
#include<stdio.h>
typedef struct record {
char name[10],lname[10],phone[10],bday[10];
};
void main() {
struct record rec;
char search;
int i,nr;
printf("\nInput number of records: ");
scanf("%d",&nr);
for (i=0 ; i<nr ;i++) {
printf("First name: ");
scanf("%s",&rec.name[i]);
printf("Last name: ");
scanf("%s",&rec.lname[i]);
printf("Phone: ");
scanf("%s",&rec.phone[i]);
printf("Bday: ");
scanf("%s",&rec.bday[i]);
}
printf("Input the first name for searching: ");
scanf("%s",&search);
for (i=0 ;i<nr;i++) {
if (search == rec.name[i]) {
printf("First name: %s\nLast name: %s\nPhone: %s\nB-day: %s",rec.name[i],rec.lname[i],rec.phone[i],rec.bday[i]);
}
}
}
注意:我已经更换了
scanf("%s",&rec.name[i]);
带
scanf("%s",rec.name[i]);
但没有效果。
答案 0 :(得分:3)
我相信您的代码存在很多问题。
首先在这一行:
scanf("%s",&search);
当你真正想要一组字符时,你已经将search
声明为char
。您也不需要&
search
,因为数组会衰减到指向第一个元素的指针。
它应该是这样的:
char search[10];
scanf("%9s", search); /* %9s to avoid buffer overflow */
您需要对所有其他scanf()
调用进行此更改,因为此代码中似乎无处不在。
您似乎也希望创建一个记录(结构)数组,因此您可能需要在获得nr
的值后进行此操作。您可以像这样创建它:
struct record rec[nr]; /* array of nr structures */
这也意味着这样的调用:
rec.name[i]
没有意义,因为您正在遍历名称中的字符,而不是struct records
中的所有记录。
这需要改为:
rec[i].name
其次,当您应该使用strcmp
时,使用==
来比较字符串。使用==
只会比较字符串的基址,而不是字符串的实际内容。
你的行应该是这样的:
if (strcmp(search, rec[i].name) == 0) {
如果您阅读strcmp()
的手册页,检查返回值0
意味着两个字符串相等。
最后,在您的第一个scanf()
电话中:
scanf("%d",&nr);
你应该检查这个的返回值:
if (scanf("%d", &nr) != 1) {
/* exit program */
}
注意:要阅读字符串,您应该使用fgets
。您可以稍后尝试升级到此,但我认为最好先了解这些基础知识。
#include <stdio.h>
#include <string.h>
#define STRSIZE 10
typedef struct {
char name[STRSIZE+1]; /* +1 to account for null-btye at the end */
char lname[STRSIZE+1];
char phone[STRSIZE+1];
char bday[STRSIZE+1];
} record;
int main() {
char search[STRSIZE+1];
int i,nr;
printf("\nInput number of records: ");
if (scanf("%d", &nr) != 1) {
printf("Invalid input.\n");
return 1;
}
record rec[nr]; /* array of records */
for (i = 0; i < nr ; i++) {
printf("First name: ");
scanf("%10s", rec[i].name);
printf("Last name: ");
scanf("%10s", rec[i].lname);
printf("Phone: ");
scanf("%10s", rec[i].phone);
printf("Bday: ");
scanf("%10s", rec[i].bday);
}
printf("Input the first name for searching: ");
scanf("%10s", search);
for (i = 0; i < nr; i++) {
if (strcmp(search, rec[i].name) == 0) {
printf("First name: %s\nLast name: %s\nPhone: %s\nB-day: %s\n",rec[i].name,rec[i].lname,rec[i].phone,rec[i].bday);
} else {
printf("Record not found.\n");
}
}
return 0;
}
答案 1 :(得分:0)
数字输入在输入缓冲区中留下一个新的行字符,然后由字符输入拾取。当scanf()
的数字输入跳过前导空格时,字符输入不会跳过此前导空格。
在%c
之前使用一个空格,它会帮助你导致如果没有使用空格,那么一个缓冲区添加了值。所以在%c
之前使用空格
scanf(" %c",&rec.name[i]);