我有这个结构,一个简单的结构,包含学生姓名和标记。当我试图将用户输入读入名称(字符数组)时,我收到一条警告,表明以下内容:
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);
}
}
程序确实提供了正确的输出,但警告仍然存在。
答案 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;本身。