这个格式说明符在 C 中表示 %[^,] 是什么意思?

what is this format specifier means %[^,] in C?

我有一个这样的代码片段

while( fscanf(b,"%c,%[^,],%[^,],%f",&book.type,book.title,book.author,&book.price)!=EOF)

正在阅读 fscanf

的格式字符串部分

具体这部分

matches a non-empty sequence of character from set of characters. If the first character of the set is ^, then all characters not in the set are matched.

因此,该格式说明符匹配除 , 字符以外的所有字符(在您的格式字符串中随后匹配)。所以,如果你有一个像

这样的结构
typedef struct Book_t {
    char type;
    char title[100];
    char author[100];
    float price;
}Book ;

然后有一个包含架构中数据的文件:

BookType,BookTitle,BookAuthor,BookPrice

然后 once 可以将每一行读入 book as

fscanf(b,"%c,%[^,],%[^,],%f",&book.type,book.title,book.author,&book.price)

对于文件的一行为:

A,old man and the sea,ernest hemingway,12.5

A 将被读入 book.type,然后所有 not 匹配逗号的字符将被读入,这样会读入直到 sea 并停止,因为下一个字符是 ,。此 , 将与格式字符串中的 , 匹配。作者字段将重复相同的过程。

请注意,读入未指定数量的字符直到匹配在逗号之前停止是个坏主意,因为它读入的缓冲区通常是固定长度的。这就是为什么在这样做时最好指定最大宽度(考虑空字符)的原因。继续上面的例子,这看起来像

fscanf(b,"%c,%99[^,],%99[^,],%f",&book.type,book.title,book.author,&book.price)

要让 99 表示它最多只能匹配 99 个字符以避免任何缓冲区溢出,因为缓冲区 title 最多只能容纳 100 个字符并且至少需要一个字节[=25=]个字符。