[解決済み】 'std::logic_error' what(): basic_string::_M_construct null not valid エラーを修正する方法とは?
2022-01-12 05:33:44
質問
入力文字列がアルファベットか大文字かWi-Fiかどうかをチェックし、そうであれば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
関連
-
FcScript V1.0 ヘルプファイル(説明書付き
-
[解決済み] file(file, "rt") のエラー : complete.cases プログラム内の無効な 'description' 引数
-
[解決済み] 式は変更可能なlvalueでなければならない
-
[解決済み】「g++」が内部コマンド、外部コマンド、操作可能なプログラム、バッチファイルとして認識されない。
-
[解決済み] libc++abi.dylib: NSException 型のキャッチされない例外で終了する (lldb)
-
[解決済み】C++の<map>に相当するC#は何ですか?[重複しています]
-
[解決済み】コレクションが変更され、列挙操作が実行されないことがある。
-
[解決済み】ValueError: 入力配列を形状 (224,224,3) から形状 (224,224) にブロードキャストできませんでした。)
-
[解決済み】ポインタと整数の比較を警告する
-
[解決済み】ログアウトと再ログインをせずに.bashrcの設定を再読み込みする方法とは?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 式は変更可能なlvalueでなければならない
-
[解決済み】C++エラー: 予想されるunqualified-idを修正する方法
-
[解決済み】このリポジトリで別のgitプロセスが動作しているようです。
-
[解決済み] 'push_back' の呼び出しに対応するメンバ関数がないエラー
-
[解決済み】git pullの取り消し、レポを古い状態に戻す方法
-
[解決済み】 c++ "Incomplete type not allowed" クラス参照情報へのアクセスエラー (前方宣言による円環状依存性)
-
[解決済み] MIPSのフェッチアドレスがワード境界にアライメントされていないため、.align 4を使用したが、まだうまくいかない
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み】ggplot2使用時の永続的な無効なグラフィックス状態エラー
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。