Как я могу остановить ввод с символом новой строки - PullRequest
0 голосов
/ 27 мая 2019

Я читаю список чисел, разделенных пробелами. В настоящее время цикл останавливается, когда я нажимаю Ctrl + Z. Мне просто нужно знать, как изменить цикл, чтобы завершить его, когда я нажимаю клавишу ввода или если он встречает символ новой строки ('\ n').

    int numArrayCount = 0;
    int num, count = 0;
    int binaryArray[CAPACITY];
    int numArray[CAPACITY];  

    //takes in positive numbers higher than zero and less than 64. 
    //End output with Ctrl+Z

    while (scanf_s( "%d", &num ) == 1) {
        if (num < 64 && num > 0) {
            binaryArray[ count++ ] = base10ToBinary(num);
            numArray[ numArrayCount++ ] = num;
        }
    }

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Как мне остановить ввод с символа новой строки (?)

Ищите '\n' с getchar() до scanf( "%d", &num ), поскольку "%d" тихо занимает лидирующие пробелы, включая '\n'.

// concept code
int ch;
while (isspace(c = getchar())) {
  if (c == '\n') return "We are done, \\n"
}
if (c == EOF) return "We are done, EOF"
// put back
ungetc(c, stdin);
if (scanf( "%d", &num ) != 1) return "Non-numeric input";
return "Success";

Полное решение здесь для float.


Альтернативный подход использует fgets(), а затем сокращает строку . Этот хороший подход имеет проблемы с управлением длинной линией и дает сбой, если строка ввода содержит необычный нулевой символ .

1 голос
/ 27 мая 2019

Прямого пути нет, потому что scanf и друзья - это всего лишь парсер бедного человека .Если у вас есть значения, разделенные произвольным числом пробел символов (пробел, табуляция, возврат, перевод строки и vtab), и не имеет значения, что это за разделители, scanf хорошо.

Если вы хотите обработать строки и затем проанализировать содержимое строки, fgets - это путь.К сожалению, вы не можете повторно сканировать из строки, но вы можете создавать хорошие парсеры строк с strtok или лучше strcspn

Другие языки (C ++, Java и т. Д.) Или, возможно, другие библиотеки могут иметь более умные инструменты,Но C изначально был построен как язык низкого уровня ...

0 голосов
/ 27 мая 2019
while (scanf_s(" %d", &num) == 1) {

Вставьте пробел перед %d, так как это заставит функцию scanf игнорировать вход, оставшийся после того, что осталось в stdin, и вам больше не понадобится этот getchar ().

enter image description here

...