問題タブ [strncpy]
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 - n文字を超える文字をコピーするstrncopy
プログラムのシェルが与えられ、いくつかの関数を入力する必要があります。
自動的に作成され、定義する必要のある関数に渡される2つの構造体があります。
この関数を定義しfoo
、そのように作成したとしましょう。
その関数が呼び出されると、出力されddddddddddddddddddddôÑ@<úHn½*Ìå«*¤ú¤F«*
ます。私が間違っていない限り、それは20文字しか保持できないのではないでしょうか?私は実際に作成していませんmsg
。
msg.data
にコピーするとさらに奇妙になりますpkt.payload
。
message.dataは以前と同じように出力されますが、packet.payloadは出力されeeeeeeeeeeeeeeeeeeee<úeeeeeeeeeeeeeeeeeeee²+!@<úHn½*Ìå«*¤ú¤F«*
ます。なぜ20文字以上なのですか?
Cを使うのは初めてなので、これが明らかな場合は許してください。しかし、言語に問題があるため、課題の核心に到達することすらできません。
c - strncpy の質問 (C 言語)
strncpy に問題があります。8 文字の文字列を 2 つに分割しようとしています (最初の 6 文字を 1 つの部分文字列に、残りの 2 文字を別の部分文字列に)。特定の問題を説明するために、コードを次のように簡略化しました。
ユーザーは入力を求められます。「12345678」と入力したとします。次に、プログラムの出力は次のとおりです。
私が期待している出力は次のようになります。
strncpy が文字列に数字を追加しているように見える方法がわかりません...明らかに、strncpy を十分に理解していませんが、何が起こっているのか説明してもらえますか?
c - strncpyとmemcpyの違いは?
s[7]
にアクセスするにはどうすればよいs
ですか?
strncpy
と の間に違いは見られませんでしたmemcpy
。output を(like )s
とともに出力したい場合、次のコードでどのような変更を加える必要がありますか。s[7]
qwertyA
出力:
c++ - strncpyドキュメントの質問
http://www.cplusplus.com/reference/clibrary/cstring/strncpy/に関して、次の点についてstrncpy
言及しています。
宛先の末尾にヌル文字が暗黙的に追加されることはないため、ソース内のC文字列の長さがnum未満の場合にのみ、宛先はヌル終了されます。
この文はどういう意味ですか?
native - ネイティブ プログラムを直接実行すると正常に動作するのに、コンドル経由で送信するとセグ フォールトで失敗するのはなぜですか?
シミュレーションに取り込もうとしているサードパーティのライブラリがあります。静的ライブラリ (.a) と、そのすべてのランタイム依存関係 (共有オブジェクト) があります。ライブラリにリンクされた非常に単純なアプリケーション (C 言語) を作成しました。サードパーティ ライブラリの API の一部である初期化関数を呼び出して終了するだけです。これをコマンドラインから直接実行すると、正常に動作します。実行可能ファイルをコンドル グリッドに送信すると、strncpy (libc.so.6) でセグ フォールトが発生して失敗します。特定のマシンでのみ実行可能ファイルを実行するようにコンドルを強制しました。そのマシンで直接実行すると、問題なく動作します。
私は主に Java プログラマーです... ネイティブ コーディングの経験は限られています。私は、nm、ldd、catchsegv などのツールに精通しており、それらを実行できるようになっています。しかし、どこから問題を探し始めたらよいかわかりません。
ldd を実行中のマシンで直接実行し、condor から送信されたスクリプトを介して実行可能ファイルと共に実行しました。ldd は、どちらの場合も同じファイルを報告します。
直接実行する方法はわかりませんが、コンドルで実行すると失敗します。プログラムを最終的に実行するプロセス、condor_startd は、root として開始し、その有効な uid をサブミッターに変更するプロセスです。もしかしてこれが何か関係あるの?
c - 文字列の長さ 76 の問題
私はここで途方に暮れています。しばらくして私のコードを投稿します...「厄介な」コードの一部を抽出するには長すぎます。ここで私の問題を説明します: 文字列 (ファイルまたはディレクトリへのパス) を、文字列とその長さ{ char *path; size_t path_len}
である構造体の配列に格納します。を挿入すると 76 になります。配列から抽出すると、文字列の長さが 78 になるか、配列内の単純な文字列でさえ 77 になります。 path
path_en
path_len
strncpy
strlen
元の文字列の長さが 77 未満の他のすべてのケースは問題なく動作します。
私は困惑しています。
c - 私の場合は strncpy または strlcpy
コピーsrc_str
先dst_arr
とその理由
追伸:良いか悪いかについて多くのことを読んだ後、私の頭は私のコンピューターのディスクよりも速く回転していstrncpy
ますstrlcpy
。
注:strlcpy
どこでも利用できるわけではありません。それはここでは問題ではありません。
c++ - utf8対応strncpy
私がこの問題に遭遇した最初の人であるとは信じがたいですが、かなりの時間を探して、これに対する解決策を見つけられませんでした。
strncpyを使用したいのですが、UTF8に対応しているため、宛先文字列にutf8文字が部分的に書き込まれません。
そうしないと、ソースが有効であることがわかっていても(ソース文字列が最大長よりも大きい場合)、結果の文字列が有効なUTF8であるかどうかを確認できません。
結果の文字列の検証は機能しますが、これを頻繁に呼び出す場合は、それをチェックするstrncpy関数を使用することをお勧めします。
glibにはありますg_utf8_strncpy
が、これは特定の数のUnicode文字をコピーしますが、Imはバイト長によって制限されるコピー関数を探しています。
明確にするために、「utf8対応」とは、宛先バッファーの制限を超えてはならず、utf-8文字の一部のみをコピーしてはならないことを意味します。(有効なutf-8入力が与えられた場合、無効なutf-8出力が発生することはありません)。
ノート:
一部の回答では、すべてのバイトがnullであり、ゼロ終了が保証されないことが指摘されていstrncpy
ます。振り返ってみると、utf8対応を要求する必要がありstrlcpy
ましたが、当時はこの関数の存在を知りませんでした。
c - strncpyは既存の文字列を上書きします
数字をローマ数字に変換する関数を作成しました。変換自体のロジックは正しいことはわかっていますが、strncpyが呼び出されるたびに、以前の「rom」の値が上書きされます。私はそれを続けて呼び出すことさえ試みました、そしてそれは後者だけを返しました。
コードの抜粋は次のとおりです。
callocを使用することも問題の一部かもしれませんが、mallocを使用してみたところ、同じ結果が得られました。