前提・実現したいこと
C言語のエラー処理の実装方法を教えて下さい。
main側の作りが悪いのは重々承知でSetString関数側のエラー処理としてもっと良い方法はないでしょうか?
発生している問題・エラーメッセージ
実行してもエラーにはなりませんが関数の呼び方次第では落ちる可能性があるのではないかと思っています。
該当のソースコード
C++
1#include <iostream> 2#include <string.h> 3#define _BUF_SIZE 8 4int SetString(const char* lpString) 5{ 6 char cString[_BUF_SIZE]; 7 if (strlen(lpString) >= (_BUF_SIZE))// ←ここで落ちる可能性があるのでは? 8 { 9 return 0; 10 } 11 strcpy_s(cString, _BUF_SIZE, lpString); 12 13 return 1; 14} 15 16int main() 17{ 18 const char cStringSrc[] = { "1234567890" }; 19 char cStringDst[_BUF_SIZE]; 20 21 memcpy(cStringDst, cStringSrc, _BUF_SIZE); 22 SetString(cStringDst); 23 24 std::cout << "Hello World!\n"; 25}
試したこと
lpStringをデバッガで見ると"12345678フフフフフフフフ1234567890"となっています。
追記
引数をCStringにすれば解決しますか?
最終的には汎用dllのエクスポート関数にしたいと思っています。CStringでもC#やVBから呼び出せますか?
今回は影響ありませんが、CとC++ではいろいろと違うところもあります。ごっちゃにしないでください。
> 引数をCStringにすれば解決しますか?
> 最終的には汎用dllのエクスポート関数にしたいと思っています。CStringでもC#やVBから呼び出せますか?
解決しません。MFC/ATLのCStringはC++のクラスであり、他言語と文字列をやり取りするにはDLLのエクスポート関数ではいったん、C言語のインターフェースで受け取る必要があります。既にいただいている回答と本質的に変わりません。
そもそもの質問は
> C言語のエラー処理の実装方法を教えて下さい。
> main側の作りが悪いのは重々承知でSetString関数側のエラー処理としてもっと良い方法はないでしょうか?
でしたよね。質問が編集されて
> 引数をCStringにすれば解決しますか?
が追記されましたけれど、
・C言語にCStringはないでしょう。C++の、それもMFCという前提ならそう指定してください。変数名からその匂いはしていましたが)。
・「良い方法はないか」というそもそもの問と「解決するか」という追加の問は対応しません
そもそもの質問が変化したあるいは間違っていたというのならその旨記載してください。
異常をおこさずに何らかの結果が欲しい、ということならその欲しい結果も示してください。これまで「どうしたいのか」が示されていなかったので言語の規約上おかしなこと、という視点で話が進んでいましたが、欲しい結果があるのならそこを着地点にする可能性はあります。
ダメ元でもう一回聞きます。
引数を std::string にしてもダメですよね?
> 引数を std::string にしてもダメですよね?
ダメです。
回答2件
あなたの回答
tips
プレビュー