Почему печатаются значения мусора? - PullRequest
0 голосов
/ 07 февраля 2019

Мой код ...

#include <stdio.h>
int main(){
    char name[20];
    int age;
    char department;
    double key;
    int i=0;
    while( (scanf("%c", &name[i])) == 1 ){
        i++;
    }
    name[i] = '\0';

    scanf("%d", &age);
    scanf("%c",&department);
    scanf("%lf",&key);


    puts(name);
    printf ("%d\n",age);
    printf("%c\n",department);
    printf("%g",key);

    return 0;
}

и входное значение

mark
20
A
3.154

Выходной результат должен быть таким же, как ввод

mark
20
A
3.154

, но чтоя получил это ...

mark
20
A
3.154

32766
�

Интересно, откуда

32766
�

откуда ...

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Ваш первый цикл с while (scanf("%c", &name[i]) == 1) должен прочитать все стандартные входные данные, вполне возможно, переполнение массива name.Вызовы scanf() после этого должны потерпеть неудачу - вы должны проверять возвращаемое значение для каждого из них.Вы перепечатываете ввод, потому что сначала вы печатаете name;остальное - из неинициализированных (или перезаписанных) переменных.Возможно, будет проще увидеть, если вы используете printf("[[%s]]\n", name); вместо puts(name); - вы увидите квадратные скобки вокруг всего вашего ввода.

Вы можете исправить это, добавив:

if (name[i] == '\n')
    break;

внутри этого начального цикла while.

0 голосов
/ 07 февраля 2019

Код

while( (scanf("%c", &name[i])) == 1 ){
    i++;
}

будет читать все символов, которые он может, он будет не останавливаться в конце mark.

Следовательно, все четыре строки читаются этим циклом в name, затем scan вызывает после , которые терпят неудачу, потому что больше нет ввода, то есть age, department и key значения остаются равными любому произвольному значению, которое они имели при создании.

Другими словами, ваш вывод можно объяснить следующим образом:

mark  \
20     \
A       >-- name
3.154  /
      /
32766    -- age (and probably nul for department)
�       -- key

Если вы хотите сделатьстрочный ввод, этот ответ предоставляет удобную функцию для этого, с защитой от переполнения буфера и так далее.Для строк вы просто используете их как введенные, в то время как нестроки можно конвертировать, используя sscanf в буфере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...