2009-10-13 38 views
8

私はatoi()を使ってLPCSTRを整数に変換しようとしており、変換が正常に行われたことを確認するために、生成した整数の桁数と元のLPCSTR(整数だけが含まれているはずです)LPCSTRの長さを見つける方法

LPCSTRの長さを計算するには苦労します。これまでのところ、唯一の方法は「/ 0」になるまでカウントされているようです。

もっと良い方法を教えてください。

ありがとう

答えて

11

strlenは何ですか?

+0

Doh!ごめんなさい、脳のおなら。これを覚えておらず、私の検索で一度も見ることができないような精神的なブロックがあったに違いない –

+3

lstrlen()それは... –

2

いいえ。

これは、C文字列の長さの見方です。 strlenを使用することもできますが、それでも文字列全体をダウンして、文字数を数えてから'\0'にする必要があります。

8

strtolを使用し、endptrを返して、文字列の末尾(0バイト)であるかどうかを確認できます。

カウントが正確であるとは限りません。 "00"は0になりますが、0は1桁で元の文字列の長さは2です。

5

strlen()機能はあなたが探している機能です。

使用例:光よりも多くの熱を生産について

size_t len = strlen(szNumber); 
2

トークが...「atoi関数」を使用して停止します:)とそれがあなたの問題のほとんどを解決します。 'atoi'は実用的価値のない死んだ関数です。文字列表現を数値に変換する適切な方法は、 'strto ...'グループ( 'strtol'、 'strtoul'など)の関数です。これらの関数は、変換エラーが発生したかどうかをすぐに判断するのに十分な情報を返します。

0

私は少し違ったことを行うだろう - ストリームが空であるかどうかをチェックし、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(これは少し異なってパッケージ化されていますが、上記のコードにかなり似ています)を検討することもできます。

1
LPCSTR lpText = "test"; 
long lTextLen = CString(lpText).GetLength(); 
14

LPCTSTRの(この場合は、桁数)の長さを見つけるために、あなたはlstrlen()なくstrlen()を使用する必要があります。出典:MSDN

0

LPCSTRは、const char*(デマクロ後)のため、strlenは問題ありません。

しかし、LPCSTRの入力に対応するように明示的に定義されたwindows関数の後には、lstrlenAを使用できます。私は真剣にそれを呼び出すとstrlenを呼び出す実際の違いがあることを疑う。

関連する問題