C语言中单个缓冲区中的多个以null结尾的字符串

C语言中单个缓冲区中的多个以null结尾的字符串,c,string,buffer,packing,C,String,Buffer,Packing,需要使用以下格式制作字符串并将其放入单个缓冲区[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=blo

需要使用以下格式制作字符串并将其放入单个缓冲区[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\0"
  "ACTION=add\0"
  "SUBSYSTEM=block\0"  
  "DEVPATH=/devices/platform/goldfish_mmc.0\0"
  "MAJOR=command\0"
  "MINOR=1\0"
  "DEVTYPE=harder\0"  
  "PARTN=1";
或者您可以使用
memcpy
显式复制它:

char str[] =
  "@/foo\0"
  "ACTION=add\0"
  "SUBSYSTEM=block\0"  
  "DEVPATH=/devices/platform/goldfish_mmc.0\0"
  "MAJOR=command\0"
  "MINOR=1\0"
  "DEVTYPE=harder\0"  
  "PARTN=1";
char buffer[1000];

memcpy(buffer, str, sizeof(str));
在这里,编译器将连接相邻的字符串常量,但只有最后一个字符串将获得隐式NUL;所有其他人都有一个明确的NUL


此外,将类似
“\01”
(在本例中实际上没有出现)的字符串分解为
“\0”“1”
,可以防止编译器将
“\01”
视为单个字符串
{0x01,0x00}
(带有隐式尾随NUL),而将is视为两个字符串
{0x00,0x31,0x00}
(也带有一个隐含的尾随NUL)这是预期的。

字符缓冲区[1000]=“@/foo\000ACTION=add\000SUBSYSTEM=block\000
…等pp.
“foo\x00ACTION”
不起作用,因为
\x00AC
在这里被视为单个字符(a和C也是十六进制数字)您可以使用
\0
而不是
\x00
,这将避免
\x00AC
被视为宽字符的问题,事实上
\0
是指定
NUL
如何获取此字符串列表的首选C方法?询问的原因是可能有一种更快的方法这取决于他们来的地方from@AhmedMasud我更喜欢
\000
,因为当您有两个字符串“abc”“123”时,
“abc\0123”
不是预期的,更简单一点,
n+=sprintf(buf+n,“%s%c”,a[I],0);
@Ctx您说得对,谢谢!我不确定
printf
的返回值是否会包含尾随的零,而不会将其解释为空终止符。