私はatoi()を使ってLPCSTRを整数に変換しようとしており、変換が正常に行われたことを確認するために、生成した整数の桁数と元のLPCSTR(整数だけが含まれているはずです)LPCSTRの長さを見つける方法
LPCSTRの長さを計算するには苦労します。これまでのところ、唯一の方法は「/ 0」になるまでカウントされているようです。
もっと良い方法を教えてください。
ありがとう
私はatoi()を使ってLPCSTRを整数に変換しようとしており、変換が正常に行われたことを確認するために、生成した整数の桁数と元のLPCSTR(整数だけが含まれているはずです)LPCSTRの長さを見つける方法
LPCSTRの長さを計算するには苦労します。これまでのところ、唯一の方法は「/ 0」になるまでカウントされているようです。
もっと良い方法を教えてください。
ありがとう
strlenは何ですか?
いいえ。
これは、C文字列の長さの見方です。 strlen
を使用することもできますが、それでも文字列全体をダウンして、文字数を数えてから'\0'
にする必要があります。
strtol
を使用し、endptr
を返して、文字列の末尾(0バイト)であるかどうかを確認できます。
カウントが正確であるとは限りません。 "00"は0になりますが、0は1桁で元の文字列の長さは2です。
トークが...「atoi関数」を使用して停止します:)とそれがあなたの問題のほとんどを解決します。 'atoi'は実用的価値のない死んだ関数です。文字列表現を数値に変換する適切な方法は、 'strto ...'グループ( 'strtol'、 'strtoul'など)の関数です。これらの関数は、変換エラーが発生したかどうかをすぐに判断するのに十分な情報を返します。
私は少し違ったことを行うだろう - ストリームが空であるかどうかをチェックし、INTを読んで、入力とにstringstreamを初期化:
#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;
}
別の合理的な可能性はstrtolはまたはそののものであろういとこ。これらは変換されていない最初の文字(もしあれば)へのポインタを返します。したがって、変換されたものと変換されなかったものをかなり直接伝えます。それらは高速ですが、一般的にストリームよりも柔軟性がありません。たとえば、浮動小数点数を読みたい場合、上記のcheck_readはそのまま動作しますが、strtolを使用するものは書き直す必要があります。
もう1つの可能性として、Boost lexical_cast(これは少し異なってパッケージ化されていますが、上記のコードにかなり似ています)を検討することもできます。
LPCSTR lpText = "test";
long lTextLen = CString(lpText).GetLength();
LPCTSTR
の(この場合は、桁数)の長さを見つけるために、あなたはlstrlen()
なくstrlen()
を使用する必要があります。出典:MSDN
LPCSTR
は、const char*
(デマクロ後)のため、strlen
は問題ありません。
しかし、LPCSTR
の入力に対応するように明示的に定義されたwindows関数の後には、lstrlenA
を使用できます。私は真剣にそれを呼び出すとstrlen
を呼び出す実際の違いがあることを疑う。
Doh!ごめんなさい、脳のおなら。これを覚えておらず、私の検索で一度も見ることができないような精神的なブロックがあったに違いない –
lstrlen()それは... –