問題タブ [kernighan-and-ritchie]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - ヒストグラムの印刷中のセグメンテーション エラー
わかりましたので、この質問をしたかったのです:「入力の単語の長さのヒストグラムを出力するプログラムを書いてください」(Brian と dennis Ritchie による本 C プログラミングの演習 1-13)。このコードでは、さまざまな単語の長さの集計のみを出力しています (最初の試みとして)。
このプログラムは正常にコンパイルされますが、コードの実行中にこのセグメンテーション違反 (コード ダンプ) エラーが発生します。このコードの何が問題になっていますか?
c - intを使用してgetwordから単語を返します。binsearchでのタイプミスの可能性
私はついにK&Rを終了しましたが、さらに別の不明確なコードに遭遇しました。6.3/6.4章
getwordを参照しています。どうすればintを返すことができ、それは単語であると思われます。最初の文字であるword[0]を返すことを理解しています。しかし、私の意見では、単語を返したい場合は、char*getwordのようなものを紹介します。私は正しいですか?
それが単語であることをどのように示すことができますか?まだgetwordについて:「in」と入力し、スペースの後にEnterキーを押したとします。getwordはスペースではないので'i'を読み取り、isalphaなので、最初のifは省略されます。それではどうなりますか?
binsearchで行をマークしました。あなたはそれが高くあるべきだと思いませんか=中程度-1; そこの?
c - 文字配列ck&rブック1-17
私はK&Rを使用しており、80文字を超えるすべての入力行を出力するプログラムを作成しようとしました。ターミナルからプログラムを実行すると、何も返されません。どこが間違っているのか誰か教えてもらえますか?また、私が確信していない部分の1つは、線s[i] = '\0';
です。誰かがこれが何をするのか説明してもらえますか?
c - K&R Cプログラミング言語1.5.1(ファイルコピー)
ええと、私は数ヶ月前に別の「よく知っている」Cの本(私の言語で)を読んだことがあります、そして私はこれについて何も学びません。K&Rが20ページに3つの章を書く方法は、単純に驚くべきものであり、もちろん、私は膨大な説明を期待することはできませんが、それはまた疑問を投げかけます。
この点について質問があります1.5.1本には次のように書かれています(16ページ):
[...]型charは、特にそのような文字データを格納するためのものですが、任意の整数型を使用できます。微妙ですが重要な理由でintを使用しました。問題は、入力の終わりと有効なデータを区別することです。解決策は、getcharは、入力がなくなると固有の値を返すことです。この値は、実際の文字と混同することはできません。この値は、「ファイルの終わり」を表すEOFと呼ばれます。getcharが返す値を保持するのに十分な大きさの型であるとcを宣言する必要があります。cは、可能なcharに加えてEOFを保持するのに十分な大きさでなければならないため、charを使用できません。したがって、intを使用します。[...]
別の説明のためにグーグルを検索した後:
EOFは、ファイルの終わりを表す特別なマクロです(Linux:キーボードでCTRL + dを使用してこれを作成し、Windowsコマンド:CTRL + zを使用します(改行の先頭にある必要があり、その後にRETURNが続く場合があります)):多くの場合EOF = -1、ただし実装に依存します。可能な文字に対して有効な値ではない値である必要があります。このため、cはint型です(予想どおりcharではありません)。
そこで、ソースをintからcharに変更して、EOF値の取得について、何が問題なのかを確認しました...しかし、問題はありません。同じように機能します。
また、getcharがどのように私が書いたすべての文字を取得し、すべてを印刷するのかを理解していませんでした。Int型は4バイト長であるため、変数内で4文字を取ることができます。しかし、私は任意の数の文字を入れることができます、それはすべてを同じように読み書きします。そしてcharで、同じことが起こります...実際に何が起こりますか?1〜4文字を超える場合、値はどこに保存されますか?
c - C プログラミング - K&R の例 1.5.2 - 変更されたプログラムが意図したとおりに機能しない
私の質問は、単純に「10 行目と 11 行目のコードが正しく機能しないのはなぜですか?」ということです。私のコードの意図した目的は、元の K&R コードが意図したとおりに実行することですが、(getchar() == '\n') いつでも nc をカウントしないようにすることです。
わずかに変更された K&R コード:
64 ビット Windows 7、CodeBlocks10.05、GNU GCC コンパイラを使用しています。
私の現在の進捗状況と理解:
サンプルの実行では、単語two
を入力して Enter キーを押します。これは 4 つの入力に相当します。その後、ctrl+Z を押して、^Z
または EOF 文字を入力します。次に、プログラムは を出力し1
ます。私はそれが印刷されることを期待していました3
。唯一の論理的な説明は、私が意図したこととは正反対のことをしているということだと思います(改行文字だけを数えますか?)。結局のところ、単語two
を入力してEnterキーを押すと、たとえば4回と表示され4
ます. 入力された改行文字ごとにカウントされているようですがnc
、Enterキーを単独で(この場合は4回)押してからEOFを押すと、常に出力されます0
. さらに実験を重ねた結果、目に見えない 4 はおそらくこのプログラムにとって魔法の数であることがわかりました。起動してEnterキーを正確に(4で割り切れる数)押すと、EOFが出力され0
ます。^Z
ただし、Enter キーを何度か押した場合、EOF は何もしません。whileループを正しく終了するには、2 行ずつ入力する必要があり、出力され1
ます。これは私の心を揺さぶっています!
c++ - 関数内の「外部」?
さて、「少し古い」本(「Cプログラミング言語」、第2版、デニス・リッチー著)を読んで、私は次のように交差しました:
外部変数は、関数の外部で1回だけ定義する必要があります。これにより、ストレージが確保されます。変数は、それにアクセスする各関数でも宣言する必要があります
そして、私は-何のようでしたか?
「変数は、それにアクセスしたい各関数でも宣言する必要があります」。それから、私はもう一度ショックを受けました:
そしてもう1つ-何?!
私の知る限り(明らかに、それはそれほど多くはなく、十分ではありません)、extern
どこかでグローバル変数を定義し、別のファイルを介してそれにアクセスしたい場合にのみ意味があります(再度定義しないでください)。
それで:
- または他の関数の中
extern int max
でこれのポイントは何ですか?main
- 標準は、これが必須であると本当に言っていますか(この例では、それを使用する各関数でこの最大値を宣言する必要がありますか?)
- これはC++でも同じですか(それがC ++タグを配置した理由です)?こんなものを見るのは初めてです。
注:これは、関数内で静的変数をexternとして宣言する使用法と同じではありませんか?
c - 二分木要素の再帰的なprintf
1つの章を読むためにK&Rに戻ってきましたが、以前に省略していた例に気づきました。この章では、バイナリツリーデータ型のトピックについて説明します。ノードに新しいエントリを保存することは理解していますが、印刷機能を使用すると混乱します。なぜ左側の印刷が最初に呼ばれるのですか?
printf
関数の最初のコマンドで、その後に左と右が続く場合、それは機能しますか?
そうでない場合-なぜそれでは?
c - カーニガンとリッチーの演習 2-3 に関する質問
16 進数を整数に変換するプログラムを C で作成しようとしています。8 進数を整数に変換するプログラムの作成に成功しました。しかし、文字 (af) を使い始めると問題が発生します。プログラムの私のアイデアは次の広告です。
パラメータは、0x または 0X で始まる文字列である必要があります。
パラメータの 16 進数は、文字列 s[] に格納されます。
整数 n は 0 に初期化され、ルールに従って変換されます。
私のコードは次のとおりです(K&Rのp37までしか読んでいないので、ポインターについてはあまり知りません):
私の質問は次のとおりです。
1. htoi(s) の引数に const を使用しない場合、g++ コンパイラから次の警告が表示されます。
2-3.c: 関数 'int main()' 内: 2-3.c:93:20: 警告: 文字列定数から 'char*' への非推奨の変換 [-Wwrite-strings] 2-3.c:97 :22: 警告: 文字列定数から 'char*' への非推奨の変換 [-Wwrite-strings] 2-3.c:101:21: 警告: 文字列定数から 'char*' への非推奨の変換 [-Wwrite-strings] 2 -3.c:105:21: 警告: 文字列定数から 'char*' への非推奨の変換 [-Wwrite-strings]
どうしてこれなの?
2.プログラムの実行に時間がかかるのはなぜですか? 私はまだ結果を見ていません。
3. ターミナルで g++ 2-3.c の代わりに cc 2-3.c と入力すると、次のエラー メッセージが表示されるのはなぜですか。
「`pow' への未定義の参照」
累乗関数を使用したすべての行で?
4. 私のプログラムの他のエラー/改善の可能性を指摘してください。
c - 関数自体が使用するものとは異なる名前付き引数を持つ関数を宣言する目的は何ですか?
たぶんこれは見せるためだけのものです。K&R を読んでいるときに、1.7 関数の冒頭に累乗関数の例が示されています。コードの 2 行目は次のように宣言します。int power(int m, int n);
関数のソースで、n
最初の引数 の名前が最初の引数 と異なるのはなぜですか。base
これは単に名前が同じである必要がないことを示すためですか? そして、この慣行は避けるべきですか?なぜですか、そうでないのですか?
c - EOF 文字が原因で、このプログラムが for ループを早期に終了する原因は何ですか?
実際の質問については、この投稿の下部をご覧ください
本当に単純なことを理解しようとしているのかもしれませんが、これを理解するまで続けることはできません.
K&R 1.9 Character Arrays を読んでいると、入力を受け取り、どの行が最も長いかを判断して、それを再表示するサンプル プログラムに出くわします。
このプログラムの getline 関数を理解するために、進行中にいくつかの情報を表示するように少し変更しました。これで、getchar() の理解が大幅に深まることでしょう。
余談ですが、ライブラリからソース コードを読み取ろうとすると、完全に圧倒されてしまいます。たとえば、getchar() を#endif
調べてみたところ、stddef.h の 300 行目のどこかにある 18 の塔を見て唖然としました。近い将来、stdio.h の関数の追求を中止することで、その頭痛を解消するつもりです。ライブラリが何かを見つけるのが非常に難しいのは普通ですか? 関数が読み取り可能なソースとして存在するべきではありませんか、それとも希望を持っているだけですか?
便宜上、変更したプログラム全体を K&R から投稿します。
入力/出力の例を次に示します。 CodeBlocks と Windows 7 を使用しています。
最後に、私の質問は、getline() 関数の for ループが到達後にループを離れ、その後にnullF
ターミネータを配置する理由です。F
\0
私の仮説は、おそらく EOF 文字を^Z
Windows 端末のように配置すると、配列は 4 文字と null ターミネータの長さに切り捨てられるということです。読み取る行の中に EOF 文字を入れると、保存された行には最大サイズ 5 しか含まれないことがわかります。また、変数が常に 0 になるs[]
ことも混乱を招きます。 main() で、while ループが壊れると値が保存されませんか?len
len
私にとっては興味深いことですが、経験豊富な C ユーザーにとってはおそらく興味深いことではありませんが、getline() の for ループの直後にある if ステートメントは、for ループの内側または外側のどちらでもかまいませんが、プログラムは変更されません。興味深いのは、for ループが本体内のコードを実行するかどうかに関係なく、少なくとも (c=getchar()) が実行されるということではないでしょうか?
質問が非常に冗長で申し訳ありませんが、役立つコメント/回答に感謝します。