atoi()を使用してLPCSTRを整数に変換しようとしていますが、変換が正常に行われたことを確認するために、生成された整数と元のLPCSTR(整数のみが含まれている必要があります)の桁数をカウントします。
LPCSTRの長さを計算する良い方法を見つけるのに苦労しています。これまでのところ、唯一の方法は、「/0」に到達するまで数えることだと思われます
より良い方法のための提案はありますか?
ありがとう
の長さ (この場合は桁数) を調べるには、ではなくLPCTSTR
を使用する必要があります。出典: MSDNlstrlen()
strlen()
それはstrlenが行うことではありませんか?
strtol
返されたものを使用して、endptr
それが文字列の終わり(0バイト)であるかどうかを確認できます。
カウントは必ずしも正確ではありません。「00」の結果は0になりますが、0の桁数は1で、元の文字列の長さは2です。
いいえ。
これが、c文字列の長さを見つける方法です。を使用することもできますstrlen
が、それでも文字列全体を調べて、。の前の文字数を数える必要があります'\0'
。
光よりも多くの熱を生成することについて話してください... :) 「atoi」の使用をやめれば、ほとんどの問題が解決します。'atoi' は実用的な価値のないデッド関数です。文字列表現を数値に変換する適切な方法は、'strto...' グループの関数 ('strtol'、'strtoul' など) です。これらの関数は、変換エラーが発生したかどうかをすぐに判断するのに十分な情報を返します。
LPCSTR lpText = "test";
long lTextLen = CString(lpText).GetLength();
私は少し違うやり方をします - 入力で文字列ストリームを初期化し、int を読んでから、ストリームが空かどうかをチェックします:
#include <sstream>
#include <iostream>
typedef char const *LPCSTR;
template <class T>
bool check_read(LPCSTR input, T &val) {
std::istringstream reader(input);
reader >> val;
char ch;
if (reader >> ch) {
std::cerr << "\nUnconverted character: " << ch << std::endl;
return false;
}
return true;
}
int main() {
LPCSTR inputs[] = {"12345", "54321a"};
int a;
for (int i=0; i<2; i++) {
check_read(inputs[i], a);
std::cout << "Converted: " << a << std::endl;
}
return 0;
}
もう 1 つの妥当な可能性は、strtol またはそのいとこの 1 つです。これらは、変換されていない最初の文字 (存在する場合) へのポインターを返すため、変換されたものと変換されなかったものをかなり直接的に示します。それらはストリームよりも高速ですが、一般に柔軟性に欠けます。たとえば、浮動小数点数を読み取りたい場合、上記の check_read はそのまま機能しますが、strtol を使用するものは書き直す必要があります。
もう 1 つの可能性として、Boost lexical_cast (パッケージは少し異なりますが、上記のコードとかなり似ています) を検討することもできます。
LPCSTR
ちょうどconst char*
(デマクロ後)なので、問題strlen
ありません。
LPCSTR
ただし、入力に対応するように明示的に定義された Windows 関数を使用している場合は、 lstrlenA
. これを呼び出すことと呼び出すことの実際的な違いがあることを真剣に疑ってstrlen
います。