0

関数を使用してレジストリに新しい値を設定するプログラムを使用していましたconst char *が、値を取得するために a を使用しました。ただし、値のサイズは 4 バイトのみです。代わりにパラメーターとして使用しようとしましたがstd::string、機能しませんでした。
私が話していることを示す小さな例があります。関数で問題を解決するのではなく、関数がこれを行う理由を知りたいです。

#include <iostream>


void test(const char * input)
{
    std::cout << input;
    std::cout << "\n" << sizeof("THIS IS A TEST") << "\n" << sizeof(input) << "\n";
    /* The code above prints out the  size of an explicit string (THIS IS A TEST), which is 15. */
    /* It then prints out the size of input, which is 4.*/

    int sum = 0;
    for(int i = 0; i < 15; i++) //Printed out each character, added the size of each to sum and printed it out.
    //The result was 15.
    {
        sum += sizeof(input[i]);
        std::cout << input[i];
    }
    std::cout << "\n" << sum;
}
int main(int argc, char * argv[])
{
    test("THIS IS A TEST");
    std::cin.get();
    return 0;
}

Output:
THIS IS A TEST
15
4
THIS IS A TEST
15

文字列パラメータを取得する正しい方法は何ですか? 文字の配列全体をループして、それぞれを文字列に出力する必要がありますか (レジストリの値は文字の最初の 4 バイトのみでした)? またはstd::string、代わりにパラメーターとして使用できますか?
これが SO の資料であるかどうかはわかりませんでしたが、プログラミング関連情報の最良の情報源の 1 つと考えているため、ここに投稿することにしました。

4

5 に答える 5

3

sizeof(input)const char*あなたが欲しいもののサイズですstrlen(input) + 1

sizeof("THIS IS A TEST")のサイズですconst char[]sizeof配列型が渡されたときの配列のサイズを示します。これが15である理由です。

std::string使用するlength()

于 2011-11-03T20:05:46.777 に答える
2

sizeofパラメータとして指定したタイプに基づいてサイズを指定します。変数の名前を使用する場合sizeofでも、結果はその変数の型にのみ基づいています。の場合、ポインタが指すゼロ終端バッファのサイズではなくchar *whatever、 char へのポインタのサイズを示しています。後者が必要な場合は、代わりに使用できます。終端を含まない、文字列の内容の長さを示すことに注意してください。そのため、(たとえば) 文字列を複製するためにスペースを割り当てたい場合は、結果に 1 を追加して、文字列が占める合計スペースを知る必要があります。strlenstrlen'\0'

はい、C++ の原則として、通常はstd::stringchar へのポインタの代わりに使用します。この場合、your_string.size()(または同等のyour_string.length()) を使用できます。

于 2011-11-03T20:08:40.957 に答える
1

std::stringほとんどの API に渡すことができない C++ オブジェクトです。char*お気づきのように、ほとんどの APIは、a とは大きく異なりstd::stringます。ただし、これは一般的なニーズであるため、 にstd::stringはそのための機能がありますc_str

std::string input;
const char* ptr = input.c_str();  //note, is const

C++11 では、これを行うのも安全です。

char* ptr = &input[0]; //nonconst

文字を変更することはできますが、サイズは固定されており、 の変更メンバーを呼び出すとポインターは無効になりますstd::string

あなたが投稿したコードに関しては、サイズが15バイトの"THIS IS A TEST"のタイプがあります。ただし、 には (明らかに) タイプがありconst char[15]、システムではサイズが 4 です。(他のシステムでは他のサイズである可能性があります)char* inputchar*

char*ポインターが指すc-string のサイズを調べるには、strlen(...)それが NULL で終了している場合に呼び出すことができます。最初の NULL 文字の前の文字数を返します。

于 2011-11-03T20:14:47.940 に答える
0

あなたが話しているレジストリが Windows レジストリである場合、それは Unicode と ASCII の問題である可能性があります。最近の Windows は、ほとんどすべての文字列を Unicode として保存します。これは、1 文字あたり 2 バイトを使用します。Unicode 文字列を std::string に入れようとすると、文字列クラスの一部の実装が「文字列の終わり」として扱う 0 (null) を取得している可能性があります。

std::wstring (ワイド文字列) または vector< wchar_t > (ワイド文字型) を使用してみてください。これらには、2 バイト文字の文字列を格納できます。

sizeof() も、あなたが与えていると思うかもしれない値を与えていません。お使いのシステムはおそらく 32 ビット Windows を実行しています。その「4」という値は、その文字列の最初の文字へのポインタのサイズです。これで問題が解決しない場合は、std::string または std::wstring を使用したときに発生する特定の結果を投稿してください (機能しないと言うだけではありません)。

于 2011-11-03T20:15:01.933 に答える
0

簡単に言えば、const char のサイズ * != const char[] のサイズです (等しい場合は偶然です)。前者はポインターです。システムの場合、ポインターはデータ型に関係なく 4 バイトです。int、char、float、何でもかまいません。これは、ポインタが常にメモリ アドレスであり、数値であるためです。ポインターの値を出力すると、実際には 4 バイトであることがわかります。const char[] は現在、配列自体であり、要求されたときに配列の長さを返します。

于 2011-11-03T20:16:25.567 に答える