Char的大小与字符串不同

时间:2011-11-03 20:03:23

标签: c++ string char sizeof function-parameter

我正在使用一个使用函数在注册表中设置新值的程序,我使用const 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

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

5 个答案:

答案 0 :(得分:3)

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

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

std::string使用length()

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

std::string是一个C ++对象,无法传递给大多数API。正如您所注意到的那样,大多数API需要char*非常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字符串的大小,如果它以NULL结尾,则可以调用strlen(...)。它将返回第一个NULL字符前的字符数。

答案 3 :(得分:0)

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

您可以尝试使用std :: wstring(宽字符串)或vector&lt; wchar_t&gt; (宽字符类型)。这些可以存储双字节字符串。

sizeof()也没有给你你认为它给你的价值。您的系统可能运行32位Windows - “4”值是指向该字符串第一个字符的指针的大小。 如果这没有帮助,请发布使用std :: string或std :: wstring时发生的具体结果(不仅仅是说它不起作用)。

答案 4 :(得分:0)

简单地说,const char的大小*!= const char []的大小(如果它们相等,那就是巧合)。前者是指针。对于系统,指针是4字节REGANDLESS数据类型。它可以是int,char,float等等。这是因为指针始终是内存地址,并且是数字。打印出指针的值,你会发现它实际上是4个字节。 const char [] now,是数组本身,并在请求时返回数组的长度。