#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. Да, я заметил (слишком поздно), жаль.