2016-09-24 2 views
0

Для этого кода ниже (в C)Scanf_s чтение неправильного ввода

int small_a, small_b; 
    printf("Please input two numbers\n"); 
    scanf_s("%d %d", &small_a, &small_b); 
    printf("%d %d", &small_a, &small_b); 
    int test_2nd = small_a - small_b; 
    if (test_2nd < 0) { 
     printf("a is smaller %d", &small_a); 
    } 
    else { 
    printf("b is smaller %d", &small_b); 

Значения он печатает, когда я пишу 4 и 2 представляют собой огромные шесть цифр (5504620 и 5504608 в данном случае) я не понять, где это происходит. stdio.h был включен в качестве заголовка.

+0

'Е ("% D% D", & small_a, & small_b);' удалить '&' -> 'printf ("% d% d ", small_a, small_b);' – BLUEPIXY

+0

1) проверьте возвращаемое значение из любого семейства функций 'scanf()', чтобы гарантировать успешную работу. 2) при печати переменной, используя 'printf()' передать действительную переменную, а не адрес переменной. – user3629249

+0

Предложите вам прочитать раздел «Помощь» о том, как задать вопрос. Например, когда возникает вопрос о проблеме времени выполнения, как ваш вопрос, почтовый код, который компилируется с помощью чистого кода, является небольшим и все еще показывает проблему. – user3629249

ответ

2

Проблема здесь в заявлении на печать. В коде

printf("%d %d", &small_a, &small_b); 

вам не нужно (хотите) взять (печать) адрес. Удалите это &.

При этом это фактически вызывает undefined behavior. %d с printf() ожидает аргумент типа int, и вы по существу поставляете int *, вызывая UB.

FWIW, чтобы напечатать адрес (указатель), необходимо использовать %p спецификатор формата и бросить аргумент void *

+0

Дьявол в деталях да? Наверное, это просто печать адреса. – Ansh

+1

@ Аньш Конечно. __God подробно. двойная проверка всегда. –

Смежные вопросы