2011-02-13 70 views
2

我在sscanf中使用確切的字符串長度%Ns格式修飾符時遇到問題。當buff包含O 5 hello R 700代碼工作正常。但是當我嘗試在名稱字段中使用空格時,它不起作用。即,當buff包含O 6 h ello R 700時,它會失敗。它使name包含 「h」 和標誌包含 「ELLO」,而不是含有 「H ELLO」C sscanf確切長度

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

回答

2

%s匹配僅非空白name。你想%[…],或更好的%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); 

(未經測試,但這樣的事情應該工作。)

+0

不錯。我必須改變的只是`name [namelen + 1]`只是`name [namelen]`而且它工作得很完美。你教我%* d和%n。非常感謝。 – 2011-02-13 21:37:42