標準入力って、単にOS側が渡してくる文字列、というだけです。特に「調べる」というほどのことはないと思いますが...
知っておくべきは
・標準入力はデフォルトではキーボード入力に割り当てられることが多い
・キーボードから入力する場合、入力はまずOS側で蓄積(バッファリング)され、Enterキーをトリガにまとめてアプリケーションに渡される。つまり、標準入力の生成はアプリケーションの外で行われる
・標準入力を取り込む関数の多くは、入力がない場合ブロック(関数から戻らない)する
ぐらいでしょうか。
「きれい」というのは、とても感覚的でなにが基準かわかりかねます。
sscanfを知っているのなら、空白を探すのは不要で(sscanfが内部でやってくれる)
C
1char str[1000];//変更
2for(i=0;i<Q;i++){
3 char s[1000];//配列にするとか必要ならどうぞ
4 int num;
5
6 fgets(str,sizeof(str),stdin); ///str_n num_nの取り出し
7 sscanf(str, "%s%d", s, &num);
8}
で十分な気もします。
scanf系の書式指定文字列で"%d"は文字列先頭の空白文字を読み飛ばしてから数値を取得する指示、
一方" "は空白文字を読み飛ばす、という指示
なので、結果として"%s%d"と"%s %d"はどちらも結果はかわりません。
あるいは、単純にscanfで
C
1for(i=0;i<Q;i++){
2 char s[1000];//配列にするとか必要ならどうぞ
3 int num;
4
5 scanf("%999s%d", s, &num);//文字列に読み込む最大桁数は制限しておかないと、scanf警察が踏み込んできたりします。
6}
とか。
これら二つは、異常系を想定しないなら、動作は同様と言っていいでしょうが、文字列が長すぎたときや数字が入力されずに改行されたとき等の動作に違いがあります。
異常系を真面目に考えるなら、想定する異常を列挙します。一つ一つ想定した事態に対応していく毎に複雑さを増していく(=きれいでなくなる)ことになります。scanf系の関数は異常入力に対する対応がとても面倒なことも多いのでstrtolなどで変換することになるでしょう。atoiは変換の失敗を検出できないので異常対応がある場合は使えません。
以下余談ですが...
char str[1][1000],kazu1[1];
なにか特別な意図があるのかも知れませんが、一般に要素数1の配列を取ることは無駄です。配列である必然性がありません。引き続き領域を確保して、配列を拡張するような使い方をすることは皆無ではありませんが、この場合はそうではないでしょう。
あと、質問のコードは文字列は取得していないし数値の取得も間違っているようにおもいますがいかが。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/13 10:12