麻烦在结构中使用scanf中的char

时间:2014-12-20 01:09:42

标签: c arrays char structure

我是一名学习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;
};

如果有人能指出我正确的方向会很棒吗?

3 个答案:

答案 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中的空格字符,它将获得输入。