将字符串的一部分分配给char数组

Assign part of a string to a char array

本文关键字:char 数组 分配 一部分 字符串      更新时间:2023-10-16

编辑:在问了这个问题之后,我被告知如何在没有null终止符的情况下初始化char数组?这几乎是相同的。(我也在构建一个网络数据包。(

无论如何,我都会保留这个问题,因为我只是分配而不是初始化。


我有一个固定大小的数组,我想将固定文本分配给:

char text[16];
text = "0123456789abcdef";

当然,这不起作用,因为右手边包含null终止符。

error: incompatible types in assignment of 'const char [17]' to 'char [16]'

文本是可读的,所以我更喜欢把它放在一块,即不写{'0', '1', ...}

我能以某种方式完成任务吗?

顺便说一句,我只有几百字节的RAM,所以最好(但其次是人类可读性要求(解决方案不应该使用两倍的RAM来进行临时复制或类似的操作。

如果用C:编写

char text[16];
strncpy(text, "0123456789abcdef", sizeof(text));

注意,text将不具有null终止符,并且与strlen等标准C函数不兼容。如果文本是可读的,我建议包括终止符。这只是一个角色,但它会让你的生活变得更轻松。

示例:

char text[17];
strncpy(text, "0123456789abcdef", sizeof(text));

首先,如果您有任何误解,"0123456789abcdef"是一个字符串文字。它的类型是const char [17],而不是const char [16],因为此字符串文字的末尾有一个空终止符

那么我假设您的意思是赋值而不是初始化。它们是不同的。

我能想出多种方法来完成作业。您可以根据自己的需要进行选择。

#include <cstddef>
#include <cstring>
#include <iostream>
#include <string>
#include <string_view>
using std::size_t;
template<size_t N>
void print(const char (&a)[N])
{
for (size_t i = 0; i != N; ++i)
putchar(a[i]);
putchar('n');
}
void foo1()
{
char text[16];
std::memcpy(text, "0123456789abcdef", sizeof text);
print(text);
}
void foo2()
{
char text[16];
std::string("0123456789abcdef").copy(text, sizeof text);
print(text);
}
void foo3()
{
char text[16];
std::string_view("0123456789abcdef").copy(text, sizeof text);
print(text);
}
// programmer needs to make sure access with src is valid
template<size_t N>
void assign(char (& dest)[N], const char * src)
{
for (size_t i = 0; i != N; ++i)
dest[i] = *src++;
}
void foo4()
{
char text[16];
assign(text, "0123456789abcdef");
print(text);
}
int main()
{
foo1();    // 0123456789abcdef
foo2();    // 0123456789abcdef
foo3();    // 0123456789abcdef
foo4();    // 0123456789abcdef
return 0;
}

一些备注:

  • std::memcpy是传统的从C复制内存的方法
  • std::string_view是在C++17中引入的一个关于字符串的轻量级视图
  • 或者,您可以编写自己的函数,如assign()——使用模板,您可以在编译时判断数组的大小。根据您的需要,您可以决定是否执行边界检查