如何接受字符数组输入到C中的结构?

时间:2014-11-18 12:47:37

标签: c arrays struct

我有这个结构,一个简单的结构,包含学生姓名和标记。当我试图将用户输入读入名称(字符数组)时,我收到一条警告,表明以下内容:

format %s expects char *, but has char*[20]

我知道这是因为无法在C中分配char arrays,因此必须使用strcpy。这个question对SO有很好的推理。但是,如何在程序中修复警告?不要以为我可以在这里使用strcpy。

#include <stdio.h>


typedef struct _student
{
    char name[20];
    unsigned int marks;
} student;


void read_list(student list[], int SIZE);
void print_list(student list[], int SIZE);

int main()
{
    const int SIZE=3;
    student list[SIZE];

    //function to enter student info.
    read_list(list, SIZE);
    //function to print student info
    print_list(list, SIZE);
    return 0;
}

void read_list(student list[], int SIZE)
{
    int i;
    char nm[20];
    for (i=0;i<SIZE;i++)
    {
        printf("\n Please enter name for student %d\n", i);
        scanf("%s",&list[i].name);

        printf("\n Please enter marks for student %d\n", i);
        scanf("%u", &list[i].marks);
    }

}

void print_list(student list[], int SIZE)
{
    int i;
    printf("\t STUDENT NAME  STUDENT MARKS\t \n");

    for(i=0;i<SIZE;i++)
    {
        printf("\t %s \t %u\n", list[i].name, list[i].marks);   
    }
}

程序确实提供了正确的输出,但警告仍然存在。

4 个答案:

答案 0 :(得分:0)

scanf("%s",&list[i].name);更改为scanf("%s",list[i].name);。删除&。因为基本上数组名称代表基地址。无需提及用于扫描字符串的数组地址。

答案 1 :(得分:0)

删除使用&扫描字符串的scanf中的%s以消除警告。所以改变

scanf("%s",&list[i].name);

scanf("%s",list[i].name);

这是因为char数组的名称衰减为指向其第一个元素的指针

答案 2 :(得分:0)

试试这段代码:

    for (i=0;i<SIZE;i++)
    {
        printf("\n Please enter name for student %d\n", i);
        scanf("%s",list[i].name);

        printf("\n Please enter marks for student %d\n", i);
        scanf("%u", &list[i].marks);
    }

这是因为&语句中使用scanf来获取地址。

在您的情况下,您使用数组名称,即name,数组名称本身提供地址。记住数组名称给出了数组的基地址。

答案 3 :(得分:0)

第33行:

scanf(&#34;%s&#34;,&amp; list [i] .name); //错误

的scanf(&#34;%S&#34;,列表[I]。名称); //右

数组的名称是初始元素位置的同义词,因此在您的代码中,变量&quot; name&#39;是名称[0]的地址。你不需要使用&amp; on&#39; name&#39;获取数组的地址。只需使用&#39; name&#39;本身。