获取具有%s但%c返回垃圾值的输出

获取具有%s但%c返回垃圾值的输出,c,arrays,character,structure,C,Arrays,Character,Structure,我想接受学生的详细信息(姓名、卷号和分数),并将其打印为输出。如果我接受学生的姓名作为字符串,程序运行正常,但当我接受学生的姓名作为字符时,我会遇到问题。 代码如下: #include<stdio.h> int main() { struct student { char name; int rn; float marks; }; struct student s[2]; int i;

我想接受学生的详细信息(姓名、卷号和分数),并将其打印为输出。如果我接受学生的姓名作为字符串,程序运行正常,但当我接受学生的姓名作为字符时,我会遇到问题。 代码如下:

#include<stdio.h>
int main()
{
    struct student 
    {
        char name;
        int rn;
        float marks;
    };
    struct student s[2];
    int i;
    printf("Enter student's name,roll no. and marks:\n");
    for(i=1;i<=2;i++)
    {
        printf("%d ",i);
        scanf("%c %d %f",&s[i].name,&s[i].rn,&s[i].marks);
    }
    printf("Student's name,roll no. and marks are:\n");
    for(i=1;i<=2;i++)
    printf("\nname=%c\trn=%d\tmarks=%0.2f\n\n",s[i].name,s[i].rn,s[i].marks);
}
#包括
int main()
{
结构学生
{
字符名;
int rn;
浮标;
};
结构学生s[2];
int i;
printf(“输入学生姓名、卷号和分数:\n”);

for(i=1;iStruct是一种值类型,它在堆栈上保存单个内存块。因此1个字符保存(取决于系统)1个字符,如“M”。为了保留名称,您需要一个指针或字符数组。这样,您只存储1个字符,之后会出现一些随机内存垃圾,因为您引用的是越界值,在本例中仅为1个字符。

当我接受学生的名称作为字符时,我面临问题?这是because
scanf()
是行缓冲的,即当您输入一个字符,然后按enter键时,这也是一个有效字符,因此您将输入两个字符。为避免此缓冲问题,请在
%c
之前输入空格

for(i = 0;i < 2;i++) { /* also you had s[2] means, you should start from  i = 0  */ 
        scanf(" %c%d%f",&s[i].name,&s[i].rn,&s[i].marks);
}
对于(i=0;i<2;i++){/*您还有s[2]的意思,您应该从i=0*开始/
scanf(“%c%d%f”,&s[i].name,&s[i].rn,&s[i].marks);
}
主要问题是(i=1;i更改此项:

for(i=1;i<=2;i++)

用于(i=1;i您已将字段描述符
%c
与数据类型
char
正确匹配,但
char
似乎是数据类型的错误选择。它表示一个字符,而对于名称,您可能需要一个足够长的
char
数组来容纳您的最大长度名称。切换到arra后字符的y,您还需要使用字段描述符
%s
。索引从0开始,而不是从1开始。@JohnBollinger是的,我理解,但我想使用单个字符作为名称。那么怎么做呢?@WebKing如其他人所说,首先从
0
开始索引
i
,并在
%c
之前加上空格。非常感谢@achal>和用户3121023。实际上%c正在考虑将下一行作为字符。当我在scanf中给%c前面的一个空格时,问题得到了解决。那么,为什么在学生1的情况下不会出现这种内存垃圾呢?您正在应用&运算符,它是一个地址运算符。简而言之,它将创建一个指向内存位置的指针,并且您正在引用该位置w在写学生名时。这是堆栈上的一个指向字符起始地址的指针。这是完全不同的。在第一种情况下,您引用的是内存位置,而不是值本身。这导致从scanf函数的角度来看,字符被视为char*。希望能有所帮助。
for(i=0; i < 2; i++)