[解決済み] getop() 関数 K&R book p 78
質問
K&Rの本を勉強しています。現在、p.78のgetop()関数を読んでいます。 コードは理解できるのですが、2つの点について説明が必要です。
getop()のコードは以下の通りです。
int getch(void);
void ungetch(int);
/* getop: get next character or numeric operand */
int getop(char s[])
{
int i, c;
while ((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.')
return c; /* not a number */
i = 0;
if (isdigit(c)) /* collect integer part */
while (isdigit(s[++i] = c = getch()))
;
if (c == '.') /* collect fraction part */
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return NUMBER;
}
について質問です。
s[0]
にしてください。
while ((s[0] = c = getch()) == ' ' || c == '\t')
whileループの考え方は、スペースと水平タブをスキップすることですが、なぜs[0]に'c'を保存しているのでしょうか?著者はなぜ単純に書かなかったのか。
while (c= getch() == ' ' || c == '\t')
この後、スペースやタブを使うことはないのですが、なぜ c を
s[0]
のために?の必要性は何でしょうか?
s[0]
ここで?
2つ目の質問は、についてです。
s[1] = '\0';
なぜ、文字列の末尾に 'Ⓐ' を付けるのでしょうか?
s[1]
ここで?
私はそれについてstackoverflow.comに投稿された以前の回答のいくつかを読みましたが、私は完全に納得していません!私は、あなたがそれを行うことができます。
上記の質問に対する回答は、「残りの入力を読み込む前に関数が戻る可能性があるため、sは完全な(そして終了した)文字列である必要がある」です。
OK。しかし、入力の最初に空白が1つあり、その後にオペランドや演算子が続く場合はどうでしょうか?この場合
s[1] = '\0'
は、文字列を早く閉じすぎてしまうのではないでしょうか?
どのように解決するのですか?
最初の質問に対する答えですが、課題には
s[0]
この場合、コーディングのショートカットとして便利です。の値は
c
がコピーされ
s[0]
に対して
あらゆる
で読み取った文字は
getch()
使用されるか廃棄されるかに関係なく。もし廃棄されるのであれば、大したことはありません。
while()
ループを使用します。もし使用するのであれば,すでにコピー先の配列
s[]
.
2つ目の質問にお答えします。
しかし、入力の最初に空白が1つあり、その後に続く場合はどうでしょうか。 オペランドまたは演算子?
なお、先ほどの
while()
ループは、空白文字(スペースとタブ)が
s[0]
ループから抜けた後 したがって
s[1] = '\0';
その
s[]
の文字列は、スペースでもタブでもない1文字と、その後に続く文字列の終端から構成されます。
次のステートメントでは
if (!isdigit(c) && c != '.')
return c; /* not a number */
を指定すると、その文字が数字か小数点以外の場合、この関数が返されます。そのため、文字列を終了させる必要があったのです。
関連
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み] テスト
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み] 未定義の動作とシーケンスポイント