Несколько строк с нулевым символом в конце в одном буфере в C
Необходимо создать строку в следующем формате и поместить ее в один буфер [1000]. Обратите внимание, что \x00 является нулевым терминатором.
@/foo\x00ACTION=add\x00SUBSYSTEM=block\x00DEVPATH=/devices/platform/goldfish_mmc.0\x00MAJOR=command\x00MINOR=1\x00DEVTYPE=harder\x00PARTN=1
Поэтому, по сути, мне нужно упаковать следующие строки с нулевым символом в конце в один буфер
@/foo
ACTION=add
SUBSYSTEM=block
DEVPATH=/devices/platform/goldfish_mmc.0
MAJOR=command
MINOR=1
DEVTYPE=harder
PARTN=1
Как я могу сделать это?
3 ответа
Вам нужно будет копировать каждую строку по одной за раз, отслеживая, где остановилась последняя копия, и начиная сразу после этого, следующую.
char *p = buffer;
strcpy(p, "@/foo");
p += strlen(p) + 1;
strcpy(p, "ACTION=add");
p += strlen(p) + 1;
...
Вы можете инициализировать свой буфер строкой, содержащей явные встроенные 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), и вместо этого обрабатывает как строку из двух символов { 0x00, 0x31, 0x00 }
(также с неявным завершающим NUL), который был задуман.
Ты можешь использовать %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);
}