[解決済み] K&RにあるC言語のgetint()の動作が理解できない。
2022-01-29 07:50:14
質問
2日前からこのコードの動作を理解しようとしているのですが、どうしても理解することができません。
私の疑問は、この関数の動作についてです。mainがないとか、そういうことは考慮しないでください。
理解できないのは、getint()がgetchar()で入力を受けた場合、次のようになることです。
- bufp=0とすると、この関数はgetch()を呼び出すので、c=aということになります。(単なるランダムな文字)
- 次にungetch(a)で、buf[0]=a、bufp=1ということになります。
- さて、ここからが本題です。次にgetint()が呼ばれると、c=buf[-bufp]=aで、結果的にbufp=0となります。
- これは再びungetch(a)となり、関数はどこにも行きません!
何か大きなコンセプトが間違っているのか分かりませんが、どうしても理解できません。
/* getint: get next integer from input into *pn */
int getint(int *pn)
{
int c, sign;
while (isspace(c = getch())) /* skip white space */
;
if (!isdigit(c) && c != EOF && c != '+' && c != '-') {
ungetch(c); /* it is not a number */
return 0;
}
sign = (c == '-') ? -1 : 1;
if (c == '+' || c == '-')
c = getch();
for (*pn = 0; isdigit(c); c = getch())
*pn = 10 * *pn + (c - '0');
*pn *= sign;
if (c != EOF)
ungetch(c);
return c;
}
#define BUFSIZE 100
char buf[BUFSIZE]; /* buffer for ungetch */
int bufp = 0; /* next free position in buf */
int getch(void) /* get a (possibly pushed-back) character */
{
return (bufp > 0) ? buf[--bufp] : getchar();
}
void ungetch(int c) /* push character back on input */
{
if(bufp >= BUFSIZE)
printf(" ungetch too many characters\n");
else
buf[bufp++] = c;
}
解決方法は?
getint()関数は、入力から数字だけを読み取ります。もし数字でない文字や先頭に+-記号があると、ungetch()を呼んでその文字を入力バッファに戻し、他の関数呼び出しで読み込めるようにします。
関連
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】LEALアセンブリ命令は何をするのですか?
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み] テスト
-
[解決済み] struct has no member named
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】malloc():メモリ破壊
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】配列型char[]が代入できない [重複]。