K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2352] ! isalnum(ch);
投稿者:トト
2024/01/08 21:24:11

はじめまして。 c言語を学んでいる者です。 入門学習サイト内で『c言語ポインタ完全制覇』を紹介されていたので、併せて学んでいます。 5章「連結リスト版」では苦戦しましたが、新たなポインタの利用法を知ることができました。  只今、理解を深めるため再度、頭から読み進めています。 理解できてない箇所がいくつかあり自力で解決できず投稿しました。 << 質問 >> 1-4-6「関数の因数として配列を渡す(つもり)」 List 1-10 get_word.c内の 11行目 while((ch=getc(fp))!= && !isalnum(ch));で /*空白文字の読み飛ばし*/が出来る仕組みが理解できずに苦戦しています。 大変恐縮ですが解釈の仕方を教えて頂けたら幸いです。 上記の!isalnum(ch)が(真)の為、20行目のbuf[len]=ch;には 入力(stdin)時に文字以外の記号などがあれば格納されしまうと思うのです。 しかし、buf[len]=ch;には単語の最初の文字が格納され、 結果、プログラムの意図どおり単語のみが表示されます。 このようなレベルですみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2353] Re:! isalnum(ch);
投稿者:(ぱ)こと管理人
2024/01/09 00:59:36

>はじめまして。 はじめまして。質問ありがとうございます。 >List 1-10 get_word.c内の >上記の!isalnum(ch)が(真)の為、20行目のbuf[len]=ch;には >入力(stdin)時に文字以外の記号などがあれば格納されしまうと思うのです。 英数字以外の記号などが来た場合、isalnum(ch)はfalseですから、 それに!を付けた「!isalnum(ch)」は真になります。 そして、「!isalnum(ch)」が真(かつファイルが終わらない)間、 11~12行目のループがぐるぐる回りますから、英数字以外の文字を読み飛ばすことになって、 17行目では「ここで,chには,単語の最初の文字が格納されている」ことになります。 ええと、11行目のwhile文について、波括弧を省略したのが誤解を招いたでしょうか。 10: /* 空白文字の読み飛ばし */ 11: while ((ch = getc(fp)) != EOF && !isalnum(ch)) { 12: ; 13: } これなら、読み飛ばしている感じがつかめるでしょうか。 ところで、細かいツッコミですみませんが、 >1-4-6「関数の因数として配列を渡す(つもり)」 正しくは「因数」ではなくて「引数」ですが、誤変換さておき、 「引数」の読みは「ひきすう」です。念のため。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2354] Re:! isalnum(ch);
投稿者:トト
2024/01/09 12:02:14

こんな早くに返信して頂きありがとうございます。 11行目の波括弧を付け加えて頂き”読み飛ばしている感じ”がわかりました。 気持ちが晴れました。 ツッコミもありがとうございます。 周りにプログラミングする人がいなく、そのような会話をすることもない為、 自分だけ分かっていればと頭の中では『インスウ、インスウ・・・』、つい出てしまいました。 ご指摘ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]