s期望char c类型的参数,但参数2的类型为' int'警告和不良回报

时间:2017-01-09 09:56:10

标签: c arrays string

是的,我知道这个问题已被多次提出,但这些都没有帮助我发现问题(重复......是的)。我想从输入中读取一系列字符串到一个数组中,然后从' 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]);

但没有效果。

2 个答案:

答案 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]);