scanf () сбрасывает первый результат в зависимости от порядка объявления переменных - PullRequest
3 голосов
/ 03 февраля 2010

Почему это не работает, как ожидалось?

int main()
{
    unsigned char louise, peter;

    printf("Age of Louise: ");
    scanf("%u", &louise);

    printf("Age of Peter: ");
    scanf("%u", &peter);

    printf("Louise: %u\n", louise);
    printf("Peter: %u\n", peter);

    return 0;
}

Выходы:

Age of Louise: 12
Age of Peter: 13
Louise: 0
Peter: 13

Но если я поменяю объявления переменных, это сработает:

unsigned char peter, louise;

Выходы:

Age of Louise: 12
Age of Peter: 13
Louise: 12
Peter: 13

Я также заметил, что использование int или unsigned int работает без необходимости замены переменных, но char - нет.

Я попытался поставить printf("%u", louise); сразу после scanf() для Луизы, и значение сохранено правильно. И если я закомментирую второй scanf(), он также работает нормально ...

«Проблема» отображается в Windows (DevCpp) и Linux (kwrite + make). Это ошибка компилятора или моя?

Ответы [ 2 ]

4 голосов
/ 03 февраля 2010

Потому что %u читает и сохраняет unsigned int, что, скорее всего, больше, чем у unsigned char, который у вас есть.Это приводит к перезаписи смежных значений.

Нет способа прочитать целочисленную строку (например, "42") и сохранить ее в char.Вы должны пройти через int.Пример:

int tmp;
char my_char;

if(scanf("Enter a number: %d", &tmp) == 1)
{
  my_char = (unsigned char) tmp;
}
1 голос
/ 03 февраля 2010

Это ваша ошибка, ваши переменные имели тип unsigned char, что составляет 1 байт, однако вы ввели 12, что составляет 4 байта (целое число без знака), что вызвало переполнение (реализация, определяемая компилятором / средой выполнения),и это объясняет перезапись следующей переменной в памяти.Вы использовали спецификатор %u для printf, который является unsigned int, для переменной unsigned char, которая неверна и не совпадает.Это объясняет, как вы обнаружили сами, что использование unsigned int или int работает, поскольку было достаточно места для хранения значений на входе.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...