2016-07-27 18 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; 
} 

入力が異なる行にある場合、それは最初の2つの例のために完全に正常に動作しますが、私は三番目で何をすべきでしょうか?私のプログラムは、第3の例では "#"のみを出力します。つまり、出力の最初の行だけが読み込まれます。

+1

ループ内で 'scanf("%d "、%x);'はうまく動作します。遭遇した 'fgets'の新しい行が返ってくるとすぐに。あるいは、 'while'ループの中に' fgets'を1行ずつ読み込むこともできます。 – ameyCU

+0

あなたは 'fgets'を複数回呼び出すことができますか? 'fgets'は1行を読み込みます。 – 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)を示します(初期化前に '' 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; 
} 
関連する問題