Intereting Posts

используя scanf для проверки входных параметров

Пытаясь использовать scanf, чтобы проверить, что у меня есть правильное количество входов (в данном случае 2), и код работает нормально, но если я поставлю 1 вход, он просто ждет вторую секунду, и если я ставлю 3, он просто отбросит 3, ничего, что я делаю, никогда не вернет сообщение об ошибке. Я искал ответ, но не нашел ничего, что мог бы использовать. Причина, по которой я спрашиваю, – это текстовая книга, которую я использую для этой темы, имеет код точно такой же, как у меня есть здесь (я скопировал другой пример для слова int_swap для слово, и это тоже не работает? Любые идеи? Извините, если это глупый или простой вопрос.

#include  #include  void int_sort2(int*, int*); int main(int argc, char* argv[]) { int x, y; printf("Please enter 2 numbers : "); if(scanf("%d%d", &x, &y) != 2) { printf("Error in numbers entered\n"); exit(EXIT_FAILURE); } printf("The original order was %d, %d\n", x, y); int_sort2(&x, &y); printf("The sorted order is : %d, %d\n", x,y); return 0; } void int_sort2(int *x, int *y) { if(*y < *x) { int temp; temp = *x; *x = *y; *y = temp; } return; } 

Поскольку в документации scanf говорилось, что

On success, the function returns the number of items of the argument list successfully filled.

Он вернет количество предметов, которые были загружены, а не количество элементов, которые вы только что вводили.

решение:

подсчитайте количество int перед сканированием.

если я поставлю 1 вход, он просто ждет вторую секунду

В этот момент, если stream ввода заканчивается (например, конец данных из канала или нажатием специальных клавиш для завершения ввода консоли), вы получите сообщение об ошибке.

Допустим, вы создали исполняемый файл mytest из приведенного выше кода. Если вы используете:

 echo 20 | ./mytest 

вы должны получить сообщение об ошибке.

если я вложу 3, он просто отбросит 3-й, ничто из этого не вернет сообщение об ошибке.

Строка scanf ищет два целых числа. Если он их найдет, он вернет их. Если в streamе больше данных, они не отвечают за их обработку. Следовательно, вы не получите сообщение об ошибке, если на входе больше 2 цифр.

Я скопировал другой пример для слова int_swap, и он тоже не работает? Есть идеи?

Ваша версия int_swap кажется прекрасной.

Хорошо, поэтому вам нужно понять, как scanf действительно ведет себя внутренне, чтобы понять, почему он не действует должным образом.

На странице scanf man:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

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

Значение EOF возвращается, если конец ввода достигнут до того, как произойдет первое успешное преобразование или соответствующий сбой. EOF также возвращается, если возникает ошибка чтения, и в этом случае устанавливается индикатор ошибки для streamа (см. Ferror (3)), а значение errno – ошибка.

скажем, у вас есть:

 #include  int main() { int x, y, rv; rv = scanf("%d %d", &x, &y); if(rv < 2) { fprintf(stderr, "Woops not enough arguments available on input\n"); return -1; } printf("X was %d and Y was %d\n", X, Y); return 0; } 

Причина, по которой вы считаете, что вы испытываете неправильное поведение, состоит в том, что вы не понимаете, как работает буферный ввод, и вы путаетесь в том, что scanf действительно будет заботиться о любом входе за пределы строки формата.

Конец строки формата НЕ указывает на конец ввода или закрытия stdin. Поэтому в коде выше, если вы хотите вызвать ошибку, запустите программу, и если вы используете некоторый * nix, просто наберите CTRL + D, чтобы указать EOF на stdin , и он вызовет оператор if если вы не ввели 2 числа.

Перемещение двух целых чисел без использования временной переменной

 void swap(int *a, int *b) { *a ^= *b; *b ^= *a; *a ^= *b; } 

Или вы можете определить макрос:

 #define swap(a, b) do { a ^= b; b ^= a; a ^= b; } while(0)