Несколько строк с нулевым символом в конце в одном буфере в 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);
}

демонстрация

Другие вопросы по тегам