Получение вывода с% s, но% c возвращает значение мусора - PullRequest
0 голосов
/ 28 апреля 2018

Я хотел принять данные об учениках (имя, номер рулона и отметки) и распечатать их так же, как и выходные данные. Программа работает нормально, если я принимаю имя в виде строки, но у меня возникает проблема, когда я принимаю имя студента как персонаж. Вот код:

#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 голосов
/ 28 апреля 2018

я сталкиваюсь с проблемой, когда принимаю имя студента как символ? Это потому, что 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.

0 голосов
/ 28 апреля 2018

Изменить это:

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

к этому:

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

поскольку индексирование начинается с 0 до размера вашего массива, минус 1.

0 голосов
/ 28 апреля 2018

Struct является типом значения и содержит один блок памяти в стеке. Таким образом, 1 символ содержит (в зависимости от системы) 1 символ, такой как «М». Чтобы сохранить имя, вам нужен указатель или массив символов. Таким образом, вы сохраняете только 1 символ, и после этого происходит некоторый случайный мусор памяти, потому что вы ссылаетесь на значение за пределами границ, которое в данном случае составляет всего 1 символ.

...