問題タブ [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 - K & R の演習: 私のコードは動作しますが、臭く感じます。クリーンアップのアドバイス?
私はK&Rの本に取り組んでいます。主に時間がないため、演習よりも先に読みました。私は追いついてきて、チュートリアルである第 1 章からほとんどすべての演習を完了しました。
私の問題は演習1-18でした。演習は次のとおりです。
入力行から末尾の空白とタブを削除し、空白行全体を削除するプログラムを作成してください
私のコード(以下)はそれを行い、機能します。それに関する私の問題は、私が実装したトリム方法です。それは...間違っている...どういうわけか感じます。たとえば、コード レビューで C# の同様のコードを見たら、私は気が狂ってしまうでしょう。(C# は私の専門の 1 つです。)
これをクリーンアップするためのアドバイスを誰か提供できますか? アドバイスは K & R の第 1 章の知識のみを使用する必要があるというキャッチフレーズがあります (完全な C ライブラリを使用してこれをクリーンアップする方法は無数にあることを私は知っています。ここでは、第 1 章と基本的な stdio.h について話しているだけです。) また、アドバイスをする際に、それが役立つ理由を説明していただけますか? (結局のところ、私は学ぼうとしています! そして、ここの専門家よりも学ぶのに適した人はいますか?)
編集: ここに表示されているすべての役立つヒントに感謝します。私はまだ C の初心者であり、具体的にはまだポインターに到達していないことを人々に思い出させたいと思います。(K&R の Ch.1 について少し覚えておいてください -- Ch.1 はポインターを実行しません。) 私はそれらの解決策のいくつかを「ちょっと」得ましたが、それらはまだ私がいる場所に対して少し進んでいます ...
そして、私が探しているもののほとんどは、trim メソッド自体です。具体的には、3回ループしているという事実です (とても汚れているように感じます)。私がもう少し賢ければ (C の高度な知識がなくても)、これはもっときれいだったかもしれません。
c - Cはどのように学べばよいですか?
C の学習に興味があります。K & Rを読んだことがあり、R と Python で簡単な C 拡張作業を行ったこともあります。C でより実質的な何かを行うための価値のあるプロジェクトのアイデアは何ですか? Dive Into Pythonに似た優れたオンライン リソースはありますか? 特に、リソースは、C を学習しようとしている新しい言語を既に知っているプログラマーに焦点を当てていました (「C では配列に長さを尋ねるのはナンセンスです。怠け者の Pythonista」などについて言及しています)。
私の背景:
数学/統計、Python、R での日常的なプログラミング、主に自然言語処理、アルゴリズムなど。
c - ##プリプロセッサ演算子のアプリケーションと考慮すべき落とし穴は何ですか?
以前の質問の多くで述べたように、私はK&Rを介して作業しており、現在プリプロセッサを使用しています。より興味深いことの1つ、つまりCを学習しようとした以前の試みからは知らなかったことは、##
プリプロセッサ演算子です。K&Rによると:
プリプロセッサ演算子
##
は、マクロ展開中に実際の引数を連結する方法を提供します。置換テキストのパラメーターがに隣接している##
場合、パラメーターは実際の引数に置き換えられ、##
周囲の空白が削除され、結果が再スキャンされます。たとえば、マクロはpaste
その2つの引数を連結します。
#define paste(front, back) front ## back
したがって
paste(name, 1)
、トークンを作成しますname1
。
誰かがこれを現実の世界でどのようにそしてなぜ使うのでしょうか?その使用の実際的な例は何ですか、そして考慮すべき落とし穴はありますか?
c - カスタム get 行入力関数
私は K&R の本を読んでいて、少し立ち往生しています。
次の何が間違っていますか?
プログラムを実行すると、ループから抜け出せず、Ctrl+C終了する必要があります。ただし、5 行目を に置き換えるとprintf("%c", c);
、Enter キーを押して新しい行を作成した後、すべての入力が正常に出力されます。
c - C でレジスタ変数を使用する良い例は何ですか?
私は K&R を読んでいて、レジスタ変数に関する小さなセクションにたどり着きました。ここの人々がこれを実践した良い例を持っているかどうか疑問に思っていました。
K&R のセクション 4.7 から:
register 宣言は
register int x;のようになります。
文字 c を登録します。
明確にするために、私はいくつかのクールなコード サンプルを見たいと思っています。私は主題を理解していると確信しているので、詳細な説明を入力する必要はありません (必要な場合を除きます)。
c - K&R Book の C プログラミング演習
次のコードが入力の文字数を出力しない理由がわかりませんか? これはK&Rの本からそのまま引用しました。現時点で C を学んでいて、これは本当に混乱しています。私には、決して EOF に達していないように見えます。もしそうなら、なぜこれが例として使われるのでしょうか?
c - K&R 演習 2-4 を完了するにはどうすればよいですか?
k&r book (The C Programming Language) を使用して C でプログラムを作成する方法を学んでいますが、演習の 1 つに問題があります。文字列 s2 内の任意の文字と一致する文字列 s1 内の文字を検出して削除するように求めています。
したがって、s1 = "A"; とします。
そして s2 = "AABAACAADAAE"
「BCDE」を返してほしい
私はそれに向けて正しい道を進んでいることを知っています。プログラムをうまく設計する方法がわかりません。追加のヒントを教えてください。二分探索木アルゴリズムについて読み込もうとしましたが、このありふれたタスクには少し高度すぎると感じました。
みんな、ありがとう!
c - ungetc (または K&R の ungetch) の目的は何ですか?
誰でも unetch の目的を説明できますか? これは、逆ポーランド電卓を作成する K&R の第 4 章からのものです。
ungetch を呼び出さずにプログラムを実行しましたが、テストでも同じように動作します。
(わかりやすくするために、getch の三項演算子を削除しました。)
c - K&R 演習: ポインター配列への多次元配列
練習問題 (5-9):day_of_year
索引付けの代わりにポインターを使用してルーチンを書き直してください。
私は疲れていて何も考えていないだけかもしれませんが、ポインターを使って多次元配列を実際に作成するにはどうすればよいでしょうか。
関数の残りの部分はおそらく理解できますが、構文を正しく理解することはできません。
c - K&R C の例でのポインター型の不一致の警告
重複の可能性:
K&R の例をコンパイルする際の問題
最近、私は K&R の C プログラミング言語に取り組んでいます。
セクション 5.11 では、関数へのポインターについて説明し、その例 (使用したい比較関数へのポインターを提供するクイックソートの実装) を入力した後、コンパイラーから警告が表示されます: 条件式のポインター型の不一致. (私のコンパイラは OS X 10.5.6 の gcc 4.0.1 です)
警告をトリガーする例の行は次のとおりです。
プログラムはセグメンテーション フォールトなしで実行されますが、できる限りすべての警告を滑らかにするか、少なくともその原因を理解したいと思っています。
numcmp の関数宣言は次のようになります。
しかし、マンページによると、stcmp には次の署名があります。
メソッドのシグネチャがわずかに異なるため、警告は単純ですか? 警告を無視すると、どのような結果になりますか?