我是一名学习C的学生,在使用结构和数组作为数组的一部分读取字符时似乎陷入困境。
当我运行代码时,它会跳过char scanf并且不会读取任何字符。读整数等没有问题。
例如(这是一个例子,我的代码要长得多,但我知道这里存在问题)。 scanf部分读取的名称是否正确?
struct stud s[5];
int i = 0;
for (int i = 0; i < 5; i++)
{
fflush(stdout);
s[i].no = i + 1;
printf("\nStud number %d\n", s[i].no);
printf("Enter name:");
scanf_s("%c", &s[i].name);
printf("Enter grade: ");
scanf_s("%d", &s[i].grade);
printf("Successfully added to grade book\n");
}
我在下面宣布:
struct stud {
int no;
char name;
int grade;
};
如果有人能指出我正确的方向会很棒吗?
答案 0 :(得分:3)
您必须将name
声明为char
数组
struct room {
int no;
char name[32]; /* pick a reasonable size */
int grade;
};
然后这个
scanf_s("%c",&s[i].name);
会改为
scanf_s("%s",s[i].name, _countof(s[i].name));
由于无法保证name
的字符长度为31
,因此您必须指定字段长度
scanf_s("%31s",s[i].name, _countof(s[i].name));
长度应为sizeOfArray - 1
,因为c字符串需要用空字节'\0'
标记字符串的结尾,而scanf_s
会将该字节附加到读取字符串。< / p>
如果您没有指定字段长度,并且事实证明字符数超过了_countof(s[i].name)
请求的字符数,则无法读取任何内容,有关详细信息,请阅读here。
答案 1 :(得分:2)
请注意,如果要为学生输入超过1个字符,则应创建一个合理大小的char
数组并使用@iharob在其答案中提到的%s
。如果您希望name
成为char
,请更改
scanf_s("%c", &s[i].name);
要
scanf_s(" %c", &s[i].name, 1);
%c
之前的空格会跳过stdin
和%c
中出现的各种空格(如换行符和空格),然后会扫描非空白字符。
答案 2 :(得分:2)
%c
不会出现字符,因为stdin
中的字符会出现,您必须跳过这些字符。
scanf_s("%c", &s[i].name);
如果上一个字符是\n
,则%c
将\n
作为输入。
您必须更改代码,只需在%c
之前添加一个空格。
scanf_s(" %c", &s[i].name);
这将刷新stdin
中的空格字符,它将获得输入。