前提・実現したいこと
C言語で単純なアスキーアート的なプログラムを作りたい。例えば、下のように入力したとする。
0 2 3 6 7 10 11 12 13 14 17 18 19 20 21 24 25 27 0 2 3 6 7 12 19 24 25 27 0 2 3 6 7 12 19 24 25 27 0 2 3 6 7 12 19 24 25 27 0 2 3 4 5 6 7 12 19 24 25 27 0 2 3 4 5 6 7 12 19 24 25 27 0 2 3 6 7 12 19 24 25 27 0 2 3 6 7 12 19 27 0 2 3 6 7 12 19 24 25 27 0 2 3 6 7 10 11 12 13 14 19 24 25 27
すると、列の先頭を0番目としてそれぞれの一列の数字番目に#が入り、次のように出力される。
# ## ## ##### ##### ## # # ## ## # # ## # # ## ## # # ## # # ## ## # # ## # # ###### # # ## # # ###### # # ## # # ## ## # # ## # # ## ## # # # # ## ## # # ## # # ## ## ##### # ## #
発生している問題・エラーメッセージ
数字列を入力する時にどうしても改行に反応してしまい、まとめて複数行に渡って入力することをできない。
該当のソースコード
C
1#include <stdio.h> 2#include <string.h> 3#define MAXLEN 128 4char buf[MAXLEN+2]; 5 6int main() { 7 char *p; 8 char str2[128]; 9 10 int s; 11 for(s=0;s < 128;s++){ 12 str2[s]=' '; 13 } 14 15 while(fgets(buf, sizeof(buf), stdin) != NULL) { 16 17 18 ////////////////////////////////////////// 19 char *p = buf; 20 int i; 21 while (sscanf(p,"%d",&i) != EOF) { 22 23 str2[i] = '#'; 24 25 p = strchr(p,' '); // ここからは空白の判定 26 if (p == NULL) break; 27 else while (*p == ' ') ++p; 28 29 } 30 /////////////////////////////////////// 31 printf("%s\n", str2); // 入力された文字列をそのまま出力 32 int s; 33 for(s=0;s < 128;s++){ 34 str2[s]=' '; 35 } 36 37 } 38 return 0; 39} 40 41
これに対し、前提・実現したいことで上げた入力例をまるまるコピーして入れると
0 2 3 6 7 10 11 12 13 14 17 18 19 20 21 24 25 27 # ## ## ##### ##### ## # 0 2 3 6 7 12 19 24 25 27 # ## ## # # ## # 0 2 3 6 7 12 19 24 25 27 # ## ## # # ## # 0 2 3 6 7 12 19 24 25 27 # ## ## # # ## # 0 2 3 4 5 6 7 12 19 24 25 27 # ###### # # ## # 0 2 3 4 5 6 7 12 19 24 25 27 # ###### # # ## # 0 2 3 6 7 12 19 24 25 27 # ## ## # # ## # 0 2 3 6 7 12 19 27 # ## ## # # # 0 2 3 6 7 12 19 24 25 27 # ## ## # # ## # 0 2 3 6 7 10 11 12 13 14 19 24 25 27 # ## ## ##### # ## #
というふうに割り込んで置き換え作業が実行されてしまう。
試したこと
fgets関数を色々いじってみましたが問題解決には至らなく、ここで質問をさせていただきました。
補足情報(FW/ツールのバージョンなど)
Win10,VScodeのターミナルで実行しました。
回答4件
あなたの回答
tips
プレビュー