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

时间:2018-04-28 15:47:45

标签: c arrays character structure

我想接受学生的详细信息(姓名,滚动号和标记)并打印输出相同。如果我接受名称作为字符串,程序正常,但当我接受学生时我遇到问题&# 39; s作为一个角色的名字。 这是代码:

#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的实际情况。

3 个答案:

答案 0 :(得分:1)

改变这个:

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

到此:

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

因为索引从0开始到数组的大小,减去1。

答案 1 :(得分:0)

Struct是一种值类型,它在堆栈上保存单个内存块。所以1个字符(取决于系统)1个字符,如“M&#39;”。为了保留名称,您需要一个指针或字符数组。这样你只存储1个字符,然后发生一些随机内存垃圾,因为你引用了超出边界值,在这种情况下只有1个字符。

答案 2 :(得分:0)

当我接受学生的名字作为角色时,我会遇到问题吗?那是因为scanf()是行缓冲的,即当你输入一个字符时然后按 ENTER 键,这也是一个有效的char,所以你给两个char作为输入。为避免此缓冲问题,请在%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]&amp; s[1],解决方案从i = 0开始。