【问题标题】:what is this format specifier means %[^,] in C?这个格式说明符在 C 中表示 %[^,] 是什么意思?
【发布时间】:2021-05-02 14:39:47
【问题描述】:

我有一个这样的代码 sn-p

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

【问题讨论】:

  • 表示读取一个字符串,但是遇到,字符就停止了。
  • 然后后面的逗号用于匹配和读取停止它的逗号。否则下一个%[^,]%f 将会停止。

标签: c file-handling


【解决方案1】:

阅读fscanf的格式字符串部分

特别是这部分

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

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

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

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

BookType,BookTitle,BookAuthor,BookPrice

然后一次可能会在每一行中读入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 并停止,因为下一个字符是@ 987654334@。此, 将与格式字符串中的, 匹配。对作者字段重复相同的过程。

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 2012-01-05
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多