5

Всем привет. Столкнулся с какой-то абсолютно мистической проблемой.

Есть код на Си:

int main(int argc, char const *argv[]) {
unsigned int  a, A = 0;
unsigned short tmp = 0;
scanf("%u", &a); // вводим значение, будем считать, что 3
//a = 3;
for (int i = 0; i < a; i++) {
    printf("--%u\n", a); // a == 3
    scanf("%u", &tmp);
    printf("--%u\n", a); // внезапно а == 0
    A |= 1 << tmp;
}

return 0;
}


Примечание: Если раскомментировать строку //a = 3 и убрать первый scanf, все адекватно работает.

Надеюсь, из комментариев в коде все понятно. Переменная a в цикле каким-то магическим образом меняет свое значение после строки scanf("%u", &tmp);

Ломаю голову уже часов 5, поэтому прибежал к вам. В чем вообще тут проблема может скрываться?

1 Answers1

6

Попробуйте написать не scanf("%u", &tmp);, а scanf("%hu", &tmp);: у вас же short int, а не int...

Harry
  • 221,325
  • Черт, помогло, спасибо. Опять на пустяках ошибки. Но почему так? Ведь в scanf в цикле значение пишется в абсолютно другую переменную. – cryptostimor Oct 09 '17 at 19:26
  • Ну, принимайте ответ :) – Harry Oct 09 '17 at 19:27
  • Приму, но разрешит только через 8 минут :) Я понял причину. scanf, видимо, забивает нулями больше чем нужно и тем самым переписывает переменную a. – cryptostimor Oct 09 '17 at 19:28
  • Ну на это я как бы и намекал - он же считает, что вы передали адрес int'а, вот и перезаписывает рядом лежащую переменную... – Harry Oct 09 '17 at 19:37
  • Самое забавное, что у меня уже вторая такая наиглупейшая ошибка, только до этого с long была. Ну да ладно, может кому-то с таким же вопросом поможет ;) – cryptostimor Oct 09 '17 at 19:43
  • В первом scanf был int. – Qwertiy Oct 09 '17 at 21:52
  • @Qwertiy Бывает же! Я написал. Потом подумал, посмотрел, увидел, что a тоже short, дописал... Как это может быть - не понимаю, но помню четко... Спасибо, исправился. – Harry Oct 10 '17 at 04:07