2016-07-27 3 views
0

Я хочу написать программу, которая читает произвольное количество положительных целых значений из stdin (разделенных новыми строками или пробелом) и выводит соответствующие число # в новых строках. Пример:Как читать неопределенное количество переменных из scanf (разделенных пробелом или новыми строками)

Input: 
5 4 3 2 1 

Output: 
##### 
#### 
### 
## 
# 

Input: 
16 
0 
4 
12 

Output: 
################ 

#### 
############ 

Input: 
1 1 3 
2 1 

Output: 
# 
# 
### 
## 
# 

Мой код:

#include <stdio.h> 

int main(){ 
    char buffer[1000]; 
    if (fgets(buffer, sizeof(buffer), stdin) != 0){ 
     int i,j,a; 
     for(i=0; sscanf(buffer+i,"%d%n",&a,&j)!=EOF; i+=j){ 
      while(a-->0){ 
       printf("*"); 
      } 
      printf("\n"); 
     } 
    } 
    return 0; 
} 

Он отлично работает в течение первых двух примеров, но то, что я должен делать с третьим, когда входы находятся в разных строках? Моя программа выводит «#» только в третьем примере, что означает, что она только считывает первую строку вывода.

+1

Внутри цикла 'scanf ("% d ",% x);' будет работать нормально. Как только вернется новая строка в столбец 'fgets'. Или иначе, чтобы читать строки за строкой, поместите 'fgets' внутри цикла while. – ameyCU

+0

Вы можете назвать 'fgets' более одного раза? 'fgets' читает одну строку. – immibis

ответ

1

Ваш код для чтения входной строки номер, а затем printf количество # .Вы просто называют fgets один раз, так что он считывает только первую строку input.You можно использовать while:

#include <stdio.h> 
int main(){ 
    char buffer[1000]; 
    while (fgets(buffer, sizeof(buffer), stdin) != 0){ 
     int i,j,a; 
     for(i=0; sscanf(buffer+i,"%d%n",&a,&j)!=EOF; i+=j){ 
      while(a-->0){ 
       printf("#"); 
      } 
      printf("\n"); 
     } 
    } 
    return 0; 
} 

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

+0

'fgets' вернет' NULL' при ошибке или EOF, поэтому вместо сравнения с '0' используйте' NULL'. И вместо сравнения возврата 'sscanf' с' EOF', вы можете использовать количество аргументов, которые оно правильно соответствует. Таким образом, это может быть 'sscanf (...) == 2;' – ameyCU

+0

@ameyCU "это может быть' sscanf (...) == 1; '' '"% n "' не влияет на возвращаемое значение. – chux

+0

Хотя ОП упоминает числовой ввод, с нечисловым импортом, в этом ответе будет отображаться неопределенное поведение (UB): ('j' используется до инициализации). Рекомендуем 'sscanf (buffer + i,"% d% n ", & a, & j) == 1' – chux

0

Вместо использования fgets, а затем sscanf, вы можете использовать fscanf/scanf в цикле while.

int main(){ 
    int a; 
    while (fscanf(stdin, "%d", &a) == 1) 
    { 
     while(a-- > 0){ 
      printf("*"); 
     } 
     printf("\n"); 
    } 
    return 0; 
}