Используйте scanf() для считывания неизвестного числа целых чисел в c

#c #scanf

Вопрос:

Мне нужно прочитать неизвестное количество строк, каждая из которых содержит неизвестное количество целых чисел, причем это число меняется от строки к строке.

Целые числа отделены друг от друга одним пробелом, и в конце строки нет пробела.

На выходе получается сумма всех целых чисел.

исключение ввода:

 5
2 2
4 4 4
6 6
3 3
 

выход:
39

Комментарии:

1. Прочитайте целые строки (например, используя fgets ). Для каждой строки в цикле вызывается strtol извлечение следующего целого числа. Если вам нужно сохранить значения для последующей обработки, используйте указатели и динамическое распределение (и перераспределение).

2. Однако, в зависимости от того, что вы должны делать с номерами, которые вы нам не говорите, тогда, возможно, будет нормально просто звонить scanf("%d", amp;number) по циклу, пока он не вернет что-то отличное от 1 . Поскольку вы не рассказываете нам о основной проблеме, о том, что вы должны делать с цифрами, очень трудно дать вам хорошее единственное решение.

3. @Balou Вам не нужно предварительно читать rows номер. Вам нужен один цикл, вызывающий scanf для чтения один int , как вы это делаете, проверяющий его возвращаемое значение, и пока возвращаемое значение равно 1, добавляющий int только что прочитанное в текущую переменную «сумма».

4. Вас волнует количество целых чисел в каждой строке? т. е. нужно ли вам различать 1 2 3n4 5 6n и 1n2 3n 4n5n6 ? Сложнее с scanf тем, имеет ли значение тип пробела.

5. scanf обладает-обычно нежелательным-свойством, заключающимся в том, что он обрабатывает все пробелы, как внутри строк, так и новые строки в концах строк, точно так же. Однако для данной конкретной постановки проблемы это как раз то, что нужно.

Ответ №1:

Тот факт, что цифры вводятся в нескольких строках, на самом деле не имеет значения. В принципе, вы просто хотите суммировать числа, введенные пользователем, до тех пор, пока входной поток не закончится.

Вы, наверное, хотите чего-то подобного:

 #include <stdio.h>

int main() {    
  int sum = 0;
  int number;

  while (scanf("%d", amp;number) == 1)
  {
    sum  = number;
  }

  printf("Sum of all numbers is %dn", sum);
}
 

Завершите ввод с Ctrlпомощью D.

Пример выполнения:

 1 2 3
4 5
6 7
8
Sum of all numbers is 36
 

Нажмите Ctrl D после ввода 8 .

Объяснение while (scanf("%d", amp;number) == 1)

scanf возвращает количество успешно отсканированных элементов или EOF время окончания входного потока. Поэтому здесь мы решаем остановить цикл, если scanf возвращает что-либо, кроме 1 (это означает, что пользователь либо нажалCtrl D, запустив EOF, либо ввел что-то, что не является числом (например ABC ).

Комментарии:

1. В Windows завершите ввод с помощью <kbd>Ctrl<kbd></kbd> </kbd><kbd>Z<kbd></kbd>, за которым следует </kbd><kbd>Введите<kbd></kbd> в отдельной строке.

2. @thebusybee <kbd>Ctrl</kbd> не работает в комментариях.

3. Да, я заметил (слишком поздно), жаль.