С sscanf точная длина - PullRequest
       2

С sscanf точная длина

2 голосов
/ 13 февраля 2011

У меня проблема с использованием точной длины строки,% Ns, модификатора формата в sscanf. Когда бафф содержит O 5 hello R 700, код работает нормально. но когда я пытаюсь получить пробел в поле имени, это не работает. то есть, когда бафф содержит O 6 h ello R 700, он терпит неудачу. name содержит "h", а флаги содержат "ello" вместо name, содержащего "h ello"

// buff will contain something in the format of "O <name_length> <name> <flags> <mode>"

int namelen;
char name[BUFFSIZE];
char flags[BUFFSIZE];
char mode[20];

sscanf(buff, "O %d", &namelen);

char extractor[BUFFSIZE];
sprintf(extractor, "O %%d %%%ds %%s %%s", namelen);

sscanf(buff, extractor, &namelen, name, flags, mode);

1 Ответ

2 голосов
/ 13 февраля 2011

%s соответствует только без пробелов. Вы хотите %[…] или, что еще лучше, %c (позаботьтесь о том, чтобы добавить конечный NUL самостоятельно).

Кроме того, %*d будет сканировать цифру, но не сохранит ее, что, я думаю, вы бы предпочли (поскольку у вас уже есть namelen ранее).

Но в целом я бы, вероятно, избегал генерации строки формата во время выполнения.

int namelen, offset;
char name[BUFFSIZE];
char flags[BUFFSIZE];
char mode[20];

sscanf(buff, "O %d %n", &namelen, &offset);
memcpy(name, buff + offset, namelen);
name[namelen + 1] = '\0';
sscanf(buff + offset + namelen, " %s %s", flags, mode);

(Не проверено, но что-то подобное должно работать.)

...