問題タブ [cstring]
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フラグメントをより安全に書き込むにはどうすればよいでしょうか。
次のCコードフラグメントがあり、エラーを特定して、より安全に記述する方法を提案する必要があります。
したがって、エラーは、strlenが'\0'
文字列の末尾を無視するため、コピーに十分なメモリが割り当てられないということですが、より安全に書き込むことで何が得られるのかわかりません。
私は私が想定しているものを使用することができますmalloc(strlen(somestring)+1))
が、それよりも良い方法があるに違いないと思いますか?
編集: OK、私は答えを受け入れました、それはANSI Cの一部ではないので、strdupソリューションは私たちから期待されないだろうと思います。それはかなり主観的な質問のようですので、私が何をしたかわかりません受け入れられたのは実際には最高です。とにかくすべての答えをありがとう。
visual-c++ - Format/printf (および一般的に可変引数) に渡された CString をキャストする必要がありますか?
私は最近、小さな MCF C++ アプリケーションを取り入れましたが、これは明らかに動作状態にあります。始めに、コード上で PC-Lint を実行しています。lint は、CStringT が Format に渡されていると不平を言っています。ネット上では意見が分かれているようです。CSting はこのユース ケースをエラーなしで処理するように設計されていると言う人もいれば、可変引数関数に渡されるときは常にキャストする必要があると言う人もいます (およびMSDN の記事) 。Stackoverflow はこの問題について合意に達することができますか?
c++ - MFC文字列をエスケープするURL
MFC CStringをURLエスケープするにはどうすればよいですか?
c++ - mfc は CString の特定のセクションをコピーします
文字列 "Bob Evans" を持つ CString 変数があるとします。位置 4 から元の CString の最後までを新しい CString にコピーしたいのですが、これのセマンティクスの例を見つけるのに苦労しています。
変数originalを STL C++ 文字列にコピーすることも考えましたが、これを達成することは、変換に関してもそれほど簡単ではありません。これに関してあなたのアドバイスは何ですか?最初に文字列を STL 文字列に格納することもできますが、データを CString ではなく STL 文字列に格納するためだけに多くのコードを再構築したくなかったため、これは最後の手段の 1 つです。前もって感謝します。
visual-c++ - VC++ 6.0 の既知の文字列の問題のリスト
このような後のサービス パックで修正される VC++ 6.0 のすべての文字列関連の問題を含むリストを探しています。誰でもこの点で私を助けてもらえますか?
検索の理由は次のとおりです。VC++ 6.0 ベースの製品で文字列関連の問題に直面しています。他の潜在的な問題を探しています。
ありがとう。
crash - %d を指定すると、CString::Format 内で VC++ 6.0 アプリケーションがクラッシュする
%d 書式指定子を使用して CString::Format 操作を実行すると、VC++ 6.0 アプリケーションがクラッシュします。これは常に発生するわけではありませんが、アプリケーション メモリが 100MB 以上になると発生します。また、CString のコピーが行われたときに、同じクラッシュが観察されることもあります。コールスタックは次のようになります
mfc42u!CFixedAlloc::Alloc+82
mfc42u!CString::AllocBuffer+3f 00000038 00000038 005b5b64
mfc42u!CString::AllocBeforeWrite+31 00000038 0a5bfdbc 005b5b64
mfc42u!CString::AssignCopy+13 00000038 057cb83f 0a5bfe90
mfc42u!CString::operator=+4b
これにより、アクセス違反の例外がスローされます。
c++ - c-string の変更中のメモリ リークの回避
教育目的で、いくつかのテスト プログラムで cstring を使用しています。「...」などのプレースホルダーを使用して文字列を短くしたいと考えています。
つまり、最大長が 13 に設定されている場合に"Quite a long string"
なり"Quite a lo..."
ます。さらに、元の文字列を破棄したくないため、短縮された文字列はコピーにする必要があります。
以下の(静的)メソッドは、私が思いついたものです。私の質問は次のとおりです。短縮された文字列にメモリを割り当てるクラスも、それを解放する責任がありますか? 私が今行っているのは、返された文字列を別の「ユーザー クラス」に格納し、メモリの解放をそのユーザー クラスに任せることです。
c++ - DT_MODIFYSTRINGオプションを使用してコピーをDrawText関数に渡すときに、元のCStringが上書きされるのはなぜですか?
私はすでにこの問題の回避策を見つけましたが、私が見ている問題を引き起こすために実際に何が起こっているのか誰かが知っているかどうか疑問に思っていました。私の推測では、それは文字列の可変性と関係があると思いますが、コピーコンストラクターではCStringオブジェクトがそれを説明していると思いました。
次のコードにより、mFileNameが上書きされます。
何が起こるかというと、UpdateTextが最初に呼び出されたときに、GetFilenameはC:\temp.txtを返します。バウンディングレクが最初の呼び出しでテキストを「...\temp.txt」に切り捨てたと仮定すると、「...\temp.txt」はUpdateTextへの2回目の呼び出しでGetFilenameから返されるものです。
さらに厄介なのは、これによってmFileNameが変更されなかったことです。
GetFilenameは常にC:\temp.txtを返しました。したがって、DrawText関数はどういうわけか元のCStringを見つけて、それを変更しているように見えます。しかし、どのように?
更新: mFileNameが上書きされる原因となる別の奇妙なコードチャンクをスローすると思いました:
新しいオブジェクトを作成し、その新しいオブジェクトを返す必要があるようです。それでも、どういうわけか、DrawTextはまだmFileNameを上書きします。
コードを次のように変更しても、問題はありません。
問題を解決しているように見える唯一のことは、回避策で示した方法で新しいCStringを構築することです。DT_MODIFYSTRINGオプションを渡すと、DrawTextは何をしますか?