c - 这个格式说明符在 C 中表示 %[^,] 是什么意思?
问题描述
我有一个这样的代码片段
while( fscanf(b,"%c,%[^,],%[^,],%f",&book.type,book.title,book.author,&book.price)!=EOF)
解决方案
阅读格式字符串部分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
,然后将读取所有与逗号不匹配的字符,因此将读入直到sea
并停止,因为下一个字符是 a ,
。这,
将与,
格式字符串中的 匹配。对于作者字段,将重复相同的过程。
请注意,读取未指定数量的字符直到匹配在逗号之前停止是一个坏主意,因为它正在读取的缓冲区通常是固定长度的。这就是为什么最好在这样做时指定最大宽度(考虑空字符)。继续上面的例子,这看起来像
fscanf(b,"%c,%99[^,],%99[^,],%f",&book.type,book.title,book.author,&book.price)
让 99 表示它最多只能匹配 99 个字符以避免任何缓冲区溢出,因为缓冲区title
最多只能容纳 100 个字符,并且该字符至少需要一个字节\0
。
推荐阅读
- r - 在 R 中创建建议的顺序变量
- sql - 具有多列数据的postgresql枢轴
- java - 这是否可以使用 thymeleaf 和 spring 以 utf-8 编码将 html 代码注入 html 页面
- javascript - 使用 React Hooks 响应 pdf 响应,但是当增加或减小窗口大小时,我得到这个 TypeError
- android - 出了什么问题:任务':app:mergeDebugResources'的执行失败
- javascript - 发多个帖子
- c# - 我尝试制作仅在特定时间移动的相机,但失败得很惨
- java - java中的数组操作hackerrank问题(得到时间限制错误)
- r - 在 r 数据框中查找值的索引位置
- python - 为什么这个重命名列代码没有反映?