首页 > 解决方案 > 这个格式说明符在 C 中表示 %[^,] 是什么意思?

问题描述

我有一个这样的代码片段

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

标签: cfile-handling

解决方案


阅读格式字符串部分fscanf

在此处输入图像描述

具体这部分

匹配字符集中的非空字符序列。如果集合的第一个字符是 ^,则匹配所有不在集合中的字符。

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

typedef struct Book_t {
    char type;
    char title[100];
    char author[100];
    float price;
}Book ;

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

BookType,BookTitle,BookAuthor,BookPrice

然后一次可能会在每一行中读入bookas

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,然后将读取所有与逗号匹配的字符,因此将读入直到sea并停止,因为下一个字符是 a ,。这,将与,格式字符串中的 匹配。对于作者字段,将重复相同的过程。

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

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

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


推荐阅读