0

char *をnumberに変換する最も簡単な方法は何ですか?4文字をintに変換するか、2文字をshortintに変換する必要があります。私はのように試しました

char* ar;
//fill ar with values  
int x= ar[1]+1[2]<<8+ar[3]<<16+ar[4]<<24; // ar[0] number of chars for number (short 2, int 4)

ただし、結果は常にゼロです(説明のために、数値をchar *に変換し、ネットワーク経由で送信するよりも、別の側でプロセスを逆にしようとしています)。

4

3 に答える 3

4

使用atoi機能:

#include <iostream>
#include <cstdlib>

int main ()
{
  int i;
  char * num = "325";
  i = atoi (num);
  std::cout << i << std::endl;
  return 0;
}

編集

コメントで指摘されているように、atoi関数を使用しないでください。変換にエラーがあったかどうかがわからないためです (atoi失敗した場合は 0 を返しますが、この場合はどうなりますかint i = atoi("0");)。C++を使用しているため、使用するオプションがありますstringstream

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
        char * num = "3443";
        int result;
        stringstream ss;
        ss << num;
        ss >> result;

        if (!ss.fail()) {
            cout << result << endl;
        }



        return 0;
}

残念ながら、ここには C++11 コンパイラがないため、バリアントを試すことはできませんstd::stoi

編集 2

私はいくつかの簡単な調査を行いましたが、ここにstrtol関数の使用を提案するトピックがあります: C++ で文字列を int に解析する方法は?

于 2012-12-11T23:28:50.050 に答える
3
ar[1]+1[2]<<8+ar[3]<<16+ar[4]<<24; 

C++ 演算子の優先順位は次のとおりです。

(ar[1]+1[2]) << (8+ar[3]) << (16+ar[4]) << 24

常に 0 であることも不思議ではありません。括弧を使用してください。も使用できますが|、とにかく括弧をお勧めします。

于 2012-12-11T23:43:44.637 に答える
2

あなたのサンプルコードに基づいて推測すると、これがあなたが探しているものだと思います(あなたは本当にありvoid*ませんchar*???)

unsigned int getValue(char* c) {
    if (c[0] == 0x2) {
        return *(reinterpret_cast<unsigned short*>(c + 1));
    } else if (c[0] == 0x4) {
        return *(reinterpret_cast<unsigned int*>(c + 1));
    } else {
        assert(false);
    }
}

int main() {

    char c[5];
    char d[5];

    c[0] = 0x2;
    d[0] = 0x4;

    char* cStart = &c[1];
    *(reinterpret_cast<unsigned short*>(cStart)) = 1000;

    char* dStart = &d[1];
    *(reinterpret_cast<unsigned int*>(dStart)) = 1123124;

    std::cout << getValue(c) << std::endl;
    std::cout << getValue(d) << std::endl;

    return 0;
}
于 2012-12-11T23:44:28.037 に答える