我正在使用一个使用函数在注册表中设置新值的程序,我使用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
作为参数吗?
我不确定这是不是很重要,但我决定在这里发帖,因为我认为这是我编程相关信息的最佳来源之一。
答案 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,是数组本身,并在请求时返回数组的长度。