C中单个缓冲区中的多个空终止字符串
multiple null terminated strings in single buffer in C
需要制作具有以下格式的字符串并将其放入单个缓冲区[1000]。请注意,\x00 是空终止符。
@/foo\x00ACTION=add\x00SUBSYSTEM=block\x00DEVPATH=/devices/platform/goldfish_mmc.0\x00MAJOR=command\x00MINOR=1\x00DEVTYPE=harder\x00PARTN=1
所以本质上我需要将以下以 null 结尾的字符串打包到一个缓冲区中
@/foo
ACTION=add
SUBSYSTEM=block
DEVPATH=/devices/platform/goldfish_mmc.0
MAJOR=command
MINOR=1
DEVTYPE=harder
PARTN=1
我该怎么做?
您需要一次将每个字符串复制一个,跟踪上一次复制停止的位置并紧接着开始复制下一个。
char *p = buffer;
strcpy(p, "@/foo");
p += strlen(p) + 1;
strcpy(p, "ACTION=add");
p += strlen(p) + 1;
...
您可以使用 %c
来打印带有 sprintf
的数字零,如下所示:
char *a[] = {"quick", "brown", "fox", "jumps"};
int n = 0;
char buf[100];
for (int i = 0 ; i != 4 ; i++) {
n += sprintf(buf+n, "%s%c", a[i], 0);
}
您可以使用包含显式嵌入 NUL 字符的字符串来初始化您的缓冲区:
char buffer[1000] =
"@/foo[=10=]"
"ACTION=add[=10=]"
"SUBSYSTEM=block[=10=]"
"DEVPATH=/devices/platform/goldfish_mmc.0[=10=]"
"MAJOR=command[=10=]"
"MINOR=1[=10=]"
"DEVTYPE=harder[=10=]"
"PARTN=1";
或者您可以使用 memcpy
:
显式复制它
char str[] =
"@/foo[=11=]"
"ACTION=add[=11=]"
"SUBSYSTEM=block[=11=]"
"DEVPATH=/devices/platform/goldfish_mmc.0[=11=]"
"MAJOR=command[=11=]"
"MINOR=1[=11=]"
"DEVTYPE=harder[=11=]"
"PARTN=1";
char buffer[1000];
memcpy(buffer, str, sizeof(str));
在这里,编译器会连接相邻的字符串常量,但只有最后一个字符串会得到一个隐式的NUL;所有其他人都有一个明确的 NUL。
此外,将 ""
之类的字符串(在本例中实际上并未出现)分解为 "[=14=]" "1"
可防止编译器将 ""
视为单个字符串{ 0x01, 0x00 }
(带有隐式尾随 NUL),而是将其视为预期的两个字符串 { 0x00, 0x31, 0x00 }
(也带有隐式尾随 NUL)。
需要制作具有以下格式的字符串并将其放入单个缓冲区[1000]。请注意,\x00 是空终止符。
@/foo\x00ACTION=add\x00SUBSYSTEM=block\x00DEVPATH=/devices/platform/goldfish_mmc.0\x00MAJOR=command\x00MINOR=1\x00DEVTYPE=harder\x00PARTN=1
所以本质上我需要将以下以 null 结尾的字符串打包到一个缓冲区中
@/foo
ACTION=add
SUBSYSTEM=block
DEVPATH=/devices/platform/goldfish_mmc.0
MAJOR=command
MINOR=1
DEVTYPE=harder
PARTN=1
我该怎么做?
您需要一次将每个字符串复制一个,跟踪上一次复制停止的位置并紧接着开始复制下一个。
char *p = buffer;
strcpy(p, "@/foo");
p += strlen(p) + 1;
strcpy(p, "ACTION=add");
p += strlen(p) + 1;
...
您可以使用 %c
来打印带有 sprintf
的数字零,如下所示:
char *a[] = {"quick", "brown", "fox", "jumps"};
int n = 0;
char buf[100];
for (int i = 0 ; i != 4 ; i++) {
n += sprintf(buf+n, "%s%c", a[i], 0);
}
您可以使用包含显式嵌入 NUL 字符的字符串来初始化您的缓冲区:
char buffer[1000] =
"@/foo[=10=]"
"ACTION=add[=10=]"
"SUBSYSTEM=block[=10=]"
"DEVPATH=/devices/platform/goldfish_mmc.0[=10=]"
"MAJOR=command[=10=]"
"MINOR=1[=10=]"
"DEVTYPE=harder[=10=]"
"PARTN=1";
或者您可以使用 memcpy
:
char str[] =
"@/foo[=11=]"
"ACTION=add[=11=]"
"SUBSYSTEM=block[=11=]"
"DEVPATH=/devices/platform/goldfish_mmc.0[=11=]"
"MAJOR=command[=11=]"
"MINOR=1[=11=]"
"DEVTYPE=harder[=11=]"
"PARTN=1";
char buffer[1000];
memcpy(buffer, str, sizeof(str));
在这里,编译器会连接相邻的字符串常量,但只有最后一个字符串会得到一个隐式的NUL;所有其他人都有一个明确的 NUL。
此外,将 ""
之类的字符串(在本例中实际上并未出现)分解为 "[=14=]" "1"
可防止编译器将 ""
视为单个字符串{ 0x01, 0x00 }
(带有隐式尾随 NUL),而是将其视为预期的两个字符串 { 0x00, 0x31, 0x00 }
(也带有隐式尾随 NUL)。