2016-07-27 34 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」,%×);'將很好地工作。只要遇到'fgets'中的新行就會返回。否則,要逐行閱讀,在'while'循環中放置'fgets'。 – 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'將在錯誤或EOF中返回NULL,所以不用與'0'比較就使用'NULL'。而不是比較'sscanf'的返回和'EOF',你可以使用它正確匹配的參數的數量。所以它可能是'sscanf(...)== 2;' – ameyCU

+0

@ameyCU「它可能是'sscanf(...)== 1;'」'「%n」'不會影響返回值。 – chux

+0

雖然OP提到了數字輸入,但是非數字輸入,這個答案會表現出未定義的行爲(UB):(在iniitalized之前使用的'j')。建議'sscanf(buffer + i,「%d%n」,&a,&j)== 1' – chux

0

而不是使用fgets然後sscanf,您可以在while循環中使用fscanf/scanf

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