我有这个结构,一个简单的结构,里面有学生的名字和分数。当我试图将用户输入读取到name(char数组)中时,我收到一条警告,指示以下行中的某些内容:
format %s expects char *, but has char*[20]
我知道这是因为char arrays
不能在C中赋值,所以必须使用strcpy
。这个question on 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);
}
}
程序确实给出了正确的输出,但警告仍然存在。
发布于 2014-11-18 20:53:37
尝试以下代码:
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
,并且数组名称本身提供了地址。记住,数组名称给出了数组的基地址。
发布于 2014-11-18 20:51:05
将scanf("%s",&list[i].name);
更改为scanf("%s",list[i].name);
。删除&
。因为基本上数组名称代表基址。不需要提及扫描字符串的数组地址。
发布于 2014-11-18 20:51:37
删除scanf
中使用%s
扫描字符串的&
以消除警告。所以改变吧
scanf("%s",&list[i].name);
至
scanf("%s",list[i].name);
这是因为char
数组的名称衰减为指向其第一个元素的指针
https://stackoverflow.com/questions/26994729
复制相似问题