[解決済み] std::logic_error' what(): basic_string::_M_construct null not valid エラーを修正する方法?
2022-01-28 20:55:21
質問
入力文字列が英数字か大文字以上か空白かを調べようとしています。もし入力文字列が上記のような誤動作をする文字列であれば、単にfalse/0を返したいだけで、それ以外は正常に動作しているプログラムの残りの部分で作業したいのです。私のプログラムのチャンクは、与えられた問題である。
std::string myfunc(std::string input){
std::string b="";
if (!input.size()) return 0;
for (int i = 0; i < input.size(); i++){
if ( input[i] < 'a' || input[i] > 'z'|| isalpha(input[i]) || isupper(input[i]) ) return 0;
}
b = input;
//just copy the input string for now.
return b;
}
で、この関数を次のように呼び出します。
int main(){
std::string input="Somthing";
std::cout << myfunc(input)<< std::endl;
return 0;
}
以下のエラーが発生しましたか?
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Aborted (core dumped)
このプログラムは、この2つのエッジケースがなければ、うまく動作します。私はこのエラーを理解し、その修正を見つけることができないのですか?何が間違っているのか、何か提案はありますか?
解決方法を教えてください。
問題は、2つの
return 0;
ステートメントを使用しています。この関数は
std::string
を受け入れるコンストラクタはありません。
int
を入力とします。しかし、このコンストラクタは
const char *
のポインタがあり、0は暗黙のうちに変換される。しかし
std::string
をヌル
char *
ポインタは
未定義の動作
を投げることを選択し、実装は
std::logic_error
例外が発生しますが、あなたのコードではキャッチしていません。
この場合、代わりに単純に空白の文字列を返します。
std::string myfunc(const std::string &input){
if (input.empty()) return "";
for (int i = 0; i < input.size(); ++i){
char ch = input[i];
if ( !((ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) ) return "";
}
return input;
}
呼び出し側は、必要であれば、戻り値が空であるかどうかをチェックすることができます。
if (myfunc(input).empty())
// error, do something
else
// OK, do something else
を返す関数とどっちがいいんだろう?
bool
ではなく
std::string
:
bool isvalid(const std::string &input){
if (input.empty()) return false;
for (int i = 0; i < input.size(); ++i){
char ch = input[i];
if ( !((ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) ) return false;
}
return true;
}
// if you still needed this function for something...
std::string myfunc(const std::string &input){
if (!isvalid(input)) return "";
return input;
}
if (!isvalid(input))
// error, do something
else
// OK, do something else
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++