問題タブ [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.

0 投票する
2 に答える
78 参照

c - なぜこのプログラムはエラーを出さないのですか?

重複の可能性:
int c = getchar()?

C の経験はありませんが、C++ は知っています。ここで 'c' が整数型として宣言されていることを確認したいのですが、驚くべきことに、このプログラムを実行すると、文字も受け入れられます。誰でも親切に説明できますか。

参照 : C プログラミング Ritchie/kernighan

0 投票する
2 に答える
162 参照

c - getword のセグメンテーション違反

こんにちは、これは Kernighan と Ritchie のキーワード カウント プログラム (ANSI 版の第 6 章セクション 3) に関する質問です。以下のリンクにコード全体を含めました。

C ソース コードでコードを実行しようとすると、出力が得られません。そのため、問題を特定するために、コード内のさまざまなポイントでステートメントを出力しました。端末ウィンドウでのプログラムの出力 (それ自体に適用された場合) は、次のようになります。

別の検索方法 (構造体キー配列による線形検索) を使用すると、同じ出力の別の組み合わせが得られますが、今回はセグメンテーション違反はありません。printf ステートメントの出力を見ると、getword 関数に何か問題があるのではないかと考えがちです。では、これらのエラーの原因は何ですか?

以下は、二分探索関数と線形探索関数の両方を含むコード全体です。

http://pastebin.com/sPEYYge6

0 投票する
3 に答える
129 参照

c - main() がないと、リンク中に実行可能ファイルが作成されない

Windows で Microsoft Visual C++ を使用しています。エラーなく正常にコンパイルできました。しかし、実行しようとすると、2 つのエラーが発生しました。デバッグエラーを読みましたが、理解できませんでした。私はCプログラミングの初心者です。

このコードは、Kernighan と Ritchie の教科書の 61 ページからのものです。

エラー:

0 投票する
1 に答える
152 参照

c - Kernighan と Ritchie からコメント プログラムを削除する

これは、Kernighan と Ritchie のコメント削除プログラムに関するものです (number 1-23 p 34 ANSI eidtion)。以下は私の解決策です。

http://pastebin.com/Fu9C94fV

このプログラムは、ほとんどの C プログラムで問題なく動作し、コメントを削除します。ただし、複数のアスタリスク ( ** /)で終わるコメントを含む一部のプログラムでは、問題が発生します (読み込めません)。そのような例の1つはこれです:

http://pastebin.com/J8EQrwve

ただし、最初に同様のコメントがあるにもかかわらず、このプログラムで動作します。

http://pastebin.com/thWKvDS7

では、コメント削除プログラムがこのように動作する原因は何だと思いますか?

0 投票する
1 に答える
149 参照

c - strcmp: 行内のフィールド

私は、スペースと英数字 (ディレクトリ順) に基づいてのみ文字列を比較するオプションと、大文字と小文字の区別を無視するオプションを持つ strcmp のバージョンを作成しています (Kerighan and Ritchie page 121 5-16)。だから私は次のことを思いついた:

これは問題なく機能し、質問に答えますが、配列の代わりに char ポインターを使用し始めると問題が発生します。配列 a と b の代わりに、char* a と char* b を初期化し、11 行目と 12 行目で a[i++] を *a++ に置き換え、15 行目と 16 行目で b[j++] を *b++ に置き換えると、次のようになります。セグメンテーション違反。a+i が a[i] のアドレスであるのに、なぜこのエラーが発生するのですか?

0 投票する
1 に答える
123 参照

c - 相互参照で行数を増やすことはできません

a、an、theなどの「ノイズ」単語を無視して、単語のリストとそれらが発生する行番号を出力するクロスリファレンサを作成しようとしています(Kernighan and Ritchie、ANSI edition p 143 question 6-3)。コードは次のとおりです。

これは私が使用した getword 関数です:

以下は、char ポインターを検索するための binsearch です。

getword が英字以外 (単語の最初の文字) または数字以外の文字に遭遇した場合、それを返すことになっています。そこで、getword が '\n' を返したときに lincecount をインクリメントするように設定しました。しかし、これは起こらないようです。

0 投票する
3 に答える
311 参照

c - \b がexから認識されないのはなぜですか。K&Rで1-10?

バックスペースを押したときに \b バックスペース シグネチャが表示されなかったのはなぜですか?

0 投票する
3 に答える
588 参照

c - KとRの練習1-24

私はカーニハンとリッチーによるCプログラミング言語でプログラムをやっています。

私は現在、次のような演習1〜24を行っています。

かっこ、角かっこ、中かっこなどの基本的な構文エラーがないかCプログラムをチェックするプログラムを作成します。escape sequencesシングルとダブルの両方の引用符、、およびコメントを忘れないでください。

私はすべてをうまくやりました...しかしescape sequences、これらの括弧、括弧、および中括弧にどのように影響するかわかりませんか?

なぜ彼らはエスケープシーケンスについて警告したのですか?

0 投票する
6 に答える
5046 参照

c - K&R 演習 1.16 - 行の長さの制限

K&R の「The C Programming Language」という本から C を学んでいます。本に書いてある練習をしています。演習番号 1.16 を実行していますが、理解できません。

演習 1.16:

最長行プログラムのメインルーチンを修正して、任意の長さの入力行の長さを正しく出力し、可能な限りテキストを出力するようにします。

私の質問:

  1. 「...テキストの可能な限り...」 - 文字列の長さに制限はありますか? たぶん、標準ヘッダーには、文字列の長さの最大許容値を持つ変数がありますか?

  2. 「...任意の長さの入力行の長さ...」-しかし、コードではMAXLINEは1000と定義されています。これも制限されたサイズです。ここにいくつかの解決策がありますが、私の意見では、前者には行の長さ (1000 文字) に制限があるため、解決策の決定ではありません。

多分私はその仕事を理解していませんでした。私の理解では、1000 文字の制限を削除する必要があります。

0 投票する
4 に答える
646 参照

c - K&R 1.9 の最長行の例では、getchar() は何をしていますか?

私は今、プログラムを理解しているようですが、重要なことには実際には使用されない文字配列にすべての戻り値をgetlineコピーするように見えるため、関数はあまり直感的ではありません。getchar()s[]

関数が実際に行っているのは、到達または復帰するs[i] = c;までの文字数をカウントすることだけであるため、関数はその行を簡単に無視できます。EOF'\n'getchar()

私が本当に理解していないのは、メインループが次のようにプログラムが前進した理由です。

唯一の説明はgetchar()、ユーザーがテキストの全行を入力し、enterキーを押した後に、関数がその魔法を実行するということです。したがって、実行時に動作するように見えると思います。

番組進行はこんな感じ?プログラムは最初に while ループに入り、次にユーザーがテキスト行を入力するのを待ち、ユーザーが Enter キーを押すと、getline関数の for ループが繰り返されますか? ユーザーは入力中に入力できるので、これが当てはまるように感じbackspaceます。

私の質問は、プログラムはどのように正確に前進するのですか? それはすべてgetchar()機能のためですか?

ctrlターミナルで-Dを押すと、他にも紛らわしいことが起こります。改行の先頭でctrl-Dを押すと、プログラムは終了します。ctrlあるテキストで満たされた行の最後で-を打った場合D、それは終了せず、 を打ったのと同じように動作しませんenterctrl-をDテキスト行で数回押すと、プログラムは最終的に終了します。

これは私の端末がセッションを処理している方法ですか、それとも単に C を学びたいのであれば心配する必要はありませんか?

私が尋ねる理由は、プログラムをよく理解するためにトレースするのが好きだからですが、getchar()関数がそれを難し​​くしています。