我想接受学生的详细信息(姓名,卷号和标记)并打印输出相同。如果我接受名称作为字符串,程序正常,但当我接受学生的名字作为一个字符时我遇到问题。这是代码:
#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);
}
学生1的信息是完全正确的。但是在学生的输出中面临问题2.我只想知道在学生2的情况下实际发生了什么。
当我接受学生的名字作为角色时,我会遇到问题?这是因为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);
}
主要的问题是for(i=1;i<=2;i++)
,因为你从s[1]
开始并期望存储到s[2]
但是没有s[2]
,因为你宣布struct student s[2];
意味着s[0]
和s[1]
,解决方案是从i = 0
开始。
改变这个:
for(i=1;i<=2;i++)
对此:
for(i=0; i < 2; i++)
因为索引从0开始到数组的大小,减去1。
Struct是一种值类型,它在堆栈上保存单个内存块。所以1个字符(取决于系统)保持1个字符,如“M”。为了保留名称,您需要一个指针或字符数组。这样,您只存储1个字符,之后会出现一些随机内存垃圾,因为您引用的是超出边界值,在这种情况下只有1个字符。