C++では、Boostライブラリを使用しない方が、std :: string strに数字または数字の後に '%'記号が含まれていることを確認するにはどうすればよいですか?これらの2つのケースに属していない場合は、エラーを発行する必要があります。すべての桁の数値または数字とパーセント記号になる文字列を解析する
答えて
#include <iostream>
#include <string>
#include <algorithm>
#include <ctype.h>
bool is_a_bad_char(char c) {
return !(isdigit(c) || (c=='%'));
}
int main() {
std::string str = "123123%4141219";
if (std::find_if(str.begin(), str.end(), is_a_bad_char) != str.end()) {
std::cout << "error" << std::endl;
return 1;
}
return 0;
}
find_first_not_of
と%
- 上記戻り
npos
場合は、チェック最後の文字が%
です。
あまりC++ - っぽいが、このようなものはそれを行うだろう:
#include <cstdlib>
#include <cstring>
bool checkformat(const std::string &s) {
const char *begin = s.c_str();
char *end;
double val = std::strtod(begin, &end);
if (end == begin) return false;
if (*end == '%') ++end;
return (end - begin == s.size());
}
あなたが最初の空白文字列を受け入れるようにしたくないので、もし、strtod
は初期の空白をスキップすることに注意してくださいそれを別に拒否する必要があります。また"NAN"
、"INF"
、"INFINITY"
(すべて大文字と小文字を区別しない)、及び+
又は-
が先行それらのもののそれぞれを受け入れ、"NAN"
任意選択の場合には、それが表すれる NaN値を示すために、いくつかの実装で定義された文字に続きます。おそらく "INF"は数字ですが、 "NAN"は定義されていないので、val != val
の場合はfalseを返し、無限をチェックすることもできます。
[編集:私はジェームズが下に提起した問題を修正したと思いますが、" "
と" %"
は依然として論争中です。そして、彼はミックスにオーバーフローを加えました。彼の答えと私の間に、あなたのアイデアを得る必要があります - 最初にあなたがして、各エッジケースを扱い、それをコーディングする方法を決定]
最初の文字列が "1 \ 0x"のような場合はどうでしょうか?私は '* pend == '%''をインクリメントした後に '* pend - begin == s.size()'をチェックします。あなたのコードも私のどちらも '' ''や ''% "'のようなものを正しく処理しません。私は 'errno'を' 0'に設定してから、それをテストしなければならないと思います。 –
また、コードにバグがあると思います。あなたは 'char * pend;'を使い、 'strtod'に'&pend'を渡します( '* pend ' pend'、 '** pend'を使って' ** pend')を実行します。また、パラメータに '&s'の代わりに' s& 'を打ち込みます。 –
@ジェームズ:埋め込まれたヌルスについて合意した。 'strtod'は、変換が行われない場合、そのパラメタ' str'を '* endptr'に格納することになっています。対象シーケンスの最初の文字へのポインタではないので、' '' 'の問題は何ですか? '* pend'は' '' '、' false'を返します。私はおそらくこれをテストしたはずです。 –
最も簡単な解決策はstrtol
またはstrtod
、依存を使用して文字列を(変換することはおそらくです。あなたが期待している数字のタイプについて)、次の文字を で見てください。ような何か:
は(エラー処理を修正するために編集):
bool
isNumberOrPercent(std::string const& value)
{
char const* end;
errno = 0;
strtod(value.c_str(), &end);
return errno == 0
&& (*end = '%' ? end + 1 : end) - value.c_str() == value.size();
}
また、 'strtod'は、変換が失敗した場合(over/underflow用ではあるが)、' errno'を設定する*必須ではないことにも注意してください。だから面倒なことに、あなたの関数は空の文字列を渡すと真を返すことになります。 –
よろしくお願いします。それは標準(IMHO)の重大なエラーです。 (あなたが書いたものを読んだときに標準が愚かなことをしたとは信じられませんでしたが、明らかにそれがあります。)したがって、 'end == value.c_str()'の追加テストが必要です。 –
私はYHOに同意します! 'strtod'には、変換中の問題を示す2つの方法があり、どちらもすべてのエラーケースをカバーしません(オーバーフローがエラーとみなされる場合)。これは弱いです。 –
- 1. は数字の文字列や記号
- 2. 数字のパーセント値を文字列に変換する
- 3. Java - この文字列の数字と文字を解析するには?
- 4. Android - 文字列を小数点記号としてカンマまたはポイントの両方で解析する方法
- 5. 数値とアルファベットの文字を検証する文字列解析アルゴリズム
- 6. JavaScriptで文字列の数値を解析する方法は?
- 7. ブーストスピリットで文字列に数値を解析するx3
- 8. Bash:文字列で操作する(パーセント記号)
- 9. 数値ストリング数字を解析する
- 10. 解析チェスの表記文字列は数
- 11. 異なる変数タイプに文字列を解析する
- 12. 数値の文字列を解析する
- 13. 文字列から数値を解析する
- 14. 文字列の度数記号を取得するには?
- 15. hanaにパーセント記号を含む文字列を保存する方法は?
- 16. 解析文字列値URL
- 17. xsltの文字列または値を解析する方法
- 18. 複数のhtmlページを文字列に解析するには?
- 19. バッチ - 私は「%」との文字列内の「MOD」置き換えたいパーセント記号
- 20. 文字列を複数の別々の文字列に解析する
- 21. 文字列を通貨記号で小数点まで解析する方法は?
- 22. Juliaで複数行文字列を解析するには?
- 23. 配列の文字列値を文字列変数として使用して、json-codenameoneを解析します。
- 24. 複数のログファイルを文字列として解析する
- 25. 文字数(区切り記号ではない)に基づいて文字列を複数の文字列に分割する方法はありますか?
- 26. Groovy:特殊記号を使用して文字列を解析する
- 27. 文字列を別の種類の数値文字列に構文解析する
- 28. アンパサンドと数字記号(&と#)
- 29. 文字数に基づいてPHPの文字列を解析する
- 30. 数字の前に数字記号を付けるには
は、変異体の多くを見るために解決策を求めて学び、最高のを選択しようとしました。 – Narek