0

我正在使用一个使用函数在注册表中设置新值的程序,我使用 aconst char *来获取该值。但是,该值的大小只有四个字节。我尝试将其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

获取字符串参数的正确方法是什么?我是否必须遍历整个字符数组并将每个字符打印到一个字符串(注册表中的值只是 char 的前四个字节)?或者我可以std::string用作参数吗?
我不确定这是否是这样的材料,但我决定在这里发帖,因为我认为这是我获取编程相关信息的最佳来源之一。

4

5 回答 5

3

sizeof(input)const char*你想要的大小strlen(input) + 1

sizeof("THIS IS A TEST")是 a 的大小const char[]sizeof在传递数组类型时给出数组的大小,这就是为什么它是 15 。

std::string使用length()

于 2011-11-03T20:05:46.777 回答
2

sizeof根据您作为参数提供的类型给出大小。如果使用变量的名称,sizeof其结果仍然仅基于该变量的类型。在 的情况下char *whatever,它告诉您指向 char 的指针的大小,而不是它指向的以零结尾的缓冲区的大小。如果你想要后者,你可以strlen改用。请注意,它告诉您字符串内容strlen的长度,包括终止符。因此,如果(例如)你想分配空间来复制一个字符串,你需要在结果中加 1 来告诉你该字符串占用的总空间。'\0'

是的,作为 C++ 中的一项规则,您通常希望使用std::string而不是指向 char 的指针。在这种情况下,您可以使用your_string.size()(或等效地,your_string.length())。

于 2011-11-03T20:08:40.957 回答
1

std::string是一个 C++ 对象,不能传递给大多数 API。char*正如您所注意到的,大多数 API都采用了,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.

至于您发布的代码,"THIS IS A TEST"其类型为const char[15],大小为 15 个字节。但是char* input,有一个类型char*(显然),它在您的系统上的大小为 4。(在其他系统上可能是其他尺寸)

要查找char*指针指向的 c 字符串的大小,您可以调用strlen(...)它是否以 NULL 结尾。它将返回第一个 NULL 字符之前的字符数。

于 2011-11-03T20:14:47.940 回答
0

如果您所说的注册表是 Windows 注册表,则可能是 Unicode 与 ASCII 的问题。现代 Windows 几乎将所有字符串都存储为 Unicode,每个字符使用 2 个字节。如果您尝试将 Unicode 字符串放入 std::string,它可能会得到一个 0(空),字符串类的一些实现将其视为“字符串结尾”。

您可以尝试使用 std::wstring (宽字符串)或 vector< wchar_t > (宽字符类型)。这些可以存储两字节字符的字符串。

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 回答