問題タブ [null-terminated]
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 - C で null ターミネータを通常の文字として扱う
char[] 内のすべての文字を別の char[] にコピーしたい。ただし、'\0' があると仮定すると、それを通常の文字 (リテラル) として扱いたいと思います。したがって、書式指定子 %s を使用して char[] を出力すると、途中で停止することはありません。例えば
これを行う方法はありますか?
c - 末尾の NULL ターミネータを削除
0 で埋められた大きな char 配列があります。受信ファイルをソケットから読み取り、その内容をバッファに配置します。すべての '\0' を含むバッファーを書き込めないため、正しいサイズの新しいバッファーを割り当てて書き込みます。私はそれを行うためにこのアプローチを使用しました:
このアプローチは機能しますが、最もスマートまたは最もエレガントな方法とは思えません。char配列から末尾のNULL文字をすべて削除する最良の方法は何ですか?
c - 部分的に接頭辞付きの Null 終了文字列
NULL 終了文字列 (SZ) を使用するか、プレフィックス付き長さ文字列 (LPS) を使用するかは、ホットな話題のようです。実際、そのトピックに関する質問もここにあります。
それで、何かが私に起こりました。両方を少し使うことはできますか?つまり、明らかに、LPS & SZ (LPSZ?) ストリングは、どちらか一方の優れた点を削除せずには作成できません。
ただし、SZ の最大の不満は、弦の長さの測定に時間がかかるため、操作に時間がかかることです。私はそれについて考えていました:
すべての弦を SZ にします。ただし、文字列の長さ mod 256 (つまり: len % 256
) を文字列の前の 1 バイトに格納することもできます。操作の複雑さが軽減されるわけではありませんが、1 バイト余分に犠牲にして、速度が大幅に向上する可能性があります。
このスキームの主な利点は次のとおりです。
- 特定のサイズに制限されない
- 通常の SZ より高速 (最大 256x)
- すべての異なるメモリ サイズ間で互換性があります
- 小さい文字列は、スペース効率が非常に高い (で無駄なバイトがない
len
) - エンディアンの問題なし
- マシン間で移植可能 (3 & 5 を参照)
これは、strlen ()
このスキームの下でどのように見えるかです (明らかに、別のライブラリを作成するため、別の名前を付けます):
適切な名前は、PPSZ (部分的にプレフィックス付きの Null 終了文字列) です。
私には、これは妥当なトレードオフのように思えます: かなり大きな加速に対して 1 バイトです。もちろん、2 バイト、4 バイト、または 8 バイトではないのかと尋ねる人もいるかもしれません。私の答えは、プログラムのほとんどの文字列は大きくなりすぎず、65536、16777216、2 ** 32
またはでスキップする2 ** 64
と価値が高くなりすぎるということです。これらのケースのいくつかでは、文字列の分割を検討するのに実際に良い時期かもしれません. 特に、1 つの文字列が 64 ビット アドレス空間のサイズを超えてオーバーフローしている場合。
とにかく、他の誰かがコンセプトについて何か考えを持っているかどうか疑問に思っていました. これまで実際にその概念を見たことがなかった理由について、おそらく見逃しているものがあると確信しています。
提案や問題が見つかった場合は、ありがとうございます。
編集:質問の意図をより明確にするために背景情報を削除しました(アルゴリズムに見逃した可能性のある潜在的な欠陥などはありますか)
注: このアルゴリズムは、主に SZ の速度の問題を解決することを目的としています。
c++ - fstream から char * を取得しようとすると奇妙な文字が表示される
ファイルから特定の位置にある 4 文字を読み取ろうとしています。コードは単純ですが、結果は非常に紛らわしいものです。
理想的には結果は「DICM」である必要がありますが、コンソールからの実際の結果は、図に示すように「DICM」に加えて奇妙な文字でした。さらに、実行するたびに文字が異なります。これは ASCII と Unicode に関するものかもしれません。プロジェクト プロパティを Unicode からマルチバイトに変更してから元に戻そうとしましたが、違いはありませんでした。
ここで何が起こっているのか、どうすれば解決できるのか知っている人はいますか? どうもありがとう!
c++ - オブジェクトの c++ null 終了配列
このようなオブジェクトのヌル終了配列を作成しようとしています
次に、このようにアクセスします
私は正確に何を間違っていますか?クリーチャーを「移動」しようとすると、EXC_BAD_ACCESS を受け取ります。for ループへのアクセスを使用してすべてのクリーチャーのアドレスを出力しようとすると、永久に出力されるため、配列の作成に問題があることはわかっています。ポインター ロジックに何か問題があることはわかっています。
生き物宣言はこちら
c++ - nullターミネータを含まない文字列でエラーをキャッチする方法
ファイル名が手動でプログラムに入力され、サイズ 9 の配列として定義されている、かなり単純なコードが以下に添付されています。この例では正しいです。ファイルの名前は、簡潔にするためにここには含まれていない関数に渡されます。この関数は、ファイルを 5 つのベクトル文字列としてデータを読み込んで開き、それらをメイン プログラムにフィードバックして、ポインター演算によってアクセスできるようにします。このケースで述べたように、プログラムは動作しますが、File1 のサイズを 9 から 8 に変更すると動作しません。これは、ヌル ターミネータが考慮されていないためです。これをより安全なプログラムにするという精神で、文字列のサイズに null ターミネータが含まれていない場合に条件を認識し、関数呼び出しとそれに関連するすべてのコード行をスキップするようにプログラムに求めています。でも、null ターミネータが含まれていない場合、コードはエラーを生成しないため、このインスタンスで例外処理を使用する方法がわかりません。任意の考えをいただければ幸いです。
c++ - C++ の cstring に関する一連の質問
cstrings について明確にしたい質問がいくつかあります。
1) 初期化: 次のように文字の配列を宣言するとき、C++ は自動的にそれを cstring として定義しますか? または(私が信じているように)文字の配列ですか?
char a[10];
言い換えれば、これは null ターミネータ ('\0') のみを含む文字の配列ですか、それとも空の文字配列ですか?
2) cstring のインデックス ( i.e. a[i] = ch+1;
) を直接操作する場合、cstring は自動的にヌル ターミネータを処理しますか、それともスペースを空けて挿入するのはプログラマの責任ですか?
コード例 (これが正しい答えだと思います):
3)<cstring>
ライブラリ (strncpy、strncat など) を使用する場合、null ターミネータは処理されますか? 例:
これは次の配列になりますか?
そして最後に:
これは次の配列になりますか?
混乱して申し訳ありません。