如何在Visual C++中将字符串文字转换为无符号字符数组

15

如何在c++中将字符串转换为无符号字符...

我有以下代码:

unsigned char m_Test[8];

我想将字符串"Hello world"赋值给m_Test

如何实现?


我已经更改了问题的标题,因为实际上您想要转换的是一个字符串字面值。在C++中,字符串是一个std类,而标题是误导性的。希望您不介意。 - Ivaylo Strandjev
@IvayloStrandjev 目前的标题极其误导。问题是“如何将字符串文字分配给无符号字符数组”,而不是“如何将字符串文字转换为无符号字符”。即使您方向正确,它也是一个无符号字符数组,而不是一个无符号字符。 - Mike S
@Mike 正确,我已经修复了。 - Ivaylo Strandjev
8个回答

24
首先,数组的大小必须足够大以容纳字符串:
 unsigned char m_Test[20];

然后你使用strcpy。你需要将第一个参数强制转换以避免警告:

 strcpy( (char*) m_Test, "Hello World" );

或者如果你想成为一个C++纯粹主义者:

 strcpy( static_cast <char*>( m_Test ), "Hello World" );

如果你想要初始化字符串而不是赋值,你也可以这样说:

 unsigned char m_Test[20] = "Hello World";

10
或许值得一提的是,在最后一个例子中可以省略尺寸,因为编译器会自动计算。 - Steve Jessop

5

就实际目的而言,strcpy的答案是正确的,但请注意8对于您的字符串来说不够大。

如果您想要非常严谨,可能需要像这样:

#include <algorithm>

int main() {
    const char greeting[] = "Hello world";
    unsigned char m_Test[sizeof(greeting)];
    std::copy(greeting, greeting + sizeof(greeting), m_Test);
}

原因是std::copy会将原始字符串中的字符转换为unsigned char。strcpy会导致原始字符串中的字符被重新解释为unsigned char。您没有说明您想要哪一个。
标准允许两者之间存在差异,尽管这很罕见:您需要char被签名,在实现中具有1s' complement或sign-magnitude表示。您可以几乎忽略这种可能性,但在我看来,了解它很值得,因为它解释了当您混淆指向char和unsigned char的指针时,好编译器给出的有趣警告。

一个数组必须在[]之间具有常量值,不能使用变量或函数。这是C++的规则。 - Buhake Sindi
2
大部分是正确的,但 sizeof 不是一个函数,而 sizeof(greeting) 是一个整数常量表达式。在某些情况下,您可以以某种方式在整数常量表达式中“使用变量”,这是其中之一,因为没有使用 greeting 的值,只使用了类型,即 const char[12] - Steve Jessop
在C++中,由于你所说的原因,strlen(greeting)是不被允许的。 - Steve Jessop

5
strncpy(m_Test, "Hello world", sizeof(m_Test));

这是关于 strncpy 的维基百科:strncpy

3
你可以使用std::stringc_str()函数来获取字符串中的char*。该方法基本上返回指向c风格字符串的指针。此后,你可以使用常规的字符串复制函数,如strcpystrncpy将值复制到test中。

2
您可以使用 strcpy 函数:
unsigned char m_Test[8];
strcpy((char*)m_Test, "Hello world");

请注意,“Hello world”对于8个字节来说太长了,因此您可能会遇到segfault错误。

2
您可以使用字符串复制函数,例如strcpy或者更好的strncpy,后者还具有一些大小检查功能。请注意保留HTML标签。
strncpy ((char*) m_Test,"Hello World",8);

1

你可以使用strcpy函数,但要注意m_Test只有8个大小,会发生溢出。Strcpy不会检查这一点,你将会得到一个异常。

char * strcpy ( char * destination, const char * source );

但是它无论如何都不会复制整个字符串。我相信主要目的是复制整个字符串。 - anthares
如果你很幸运的话,你会得到一个异常。 - Steve Jessop
迟早你会遇到一个异常 :) - anthares
不一定。您的程序可能只会输出错误的结果,也可能完全没有问题。这取决于堆栈中被破坏的内容是什么。而且这还假设硬件错误会导致异常,这也不确定。 - Steve Jessop

0
string uInput;
cout << "Enter message" << endl;
getline(cin, uInput);

我在这里加1,因为在C字符串中我们在末尾有'\0'。
unsigned char dataS[uInput.size()+1];
strcpy(reinterpret_cast<char*>(dataS), uInput.c_str());

我认为这个例子将来会帮助其他人更多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接