C sscanf确切的长度

时间:2011-02-13 06:46:00

标签: c scanf

我在使用sscanf中的确切字符串长度%Ns格式修饰符时遇到问题。当buff包含O 5 hello R 700时,代码工作正常。但是当我尝试在名称字段中有空格时,它不起作用。即,当buff包含O 6 h ello R 700时,它会失败。它使name包含“h”并且标志包含“ello”而不是包含“h ello”的name

// 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 个答案:

答案 0 :(得分:2)

%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);

(未经测试,但类似的东西应该有效。)