我该如何对格式化的fscanf进行格式化,以便将输入
{'name surname','username',points}
格式化为不包含撇号的字符串?fscanf(fp,"{%s %s %d}",name,username,username1);
fscanf(fp,"{'%[a-zA-Z ]', '%[a-zA-Z ]', %d}",name,username,username1);
%[^']
,并允许连字符名称。当然,O'Rourke先生仍然会受到影响,但这是提问者的定义问题。有趣的是,username1
是一个指向整数的指针。通常情况下,应该是&username1
,但没有变量定义,很难知道哪个是正确的。为了避免缓冲区溢出,最好对读入字符串的字符数进行上限设置(例如%49[^']
用于char name[50];
)。而且必须测试返回值以确保已读取3个值。 - Jonathan Leffler"{'%[^'], '%[^'], %d"
(仅匹配一个参数,第一个参数),并尝试了"{'%[^'], '%[a-zA-Z], %d"
,结果相同。您能否解释一下如何更简洁地使用 %[^']
? - ryyker"{'%[^']', '%[^']', %d"
。 - Jonathan Leffler%49[^'\n]
作为扫描集会更安全(假设char name[50];
)。最好使用fgets()
读取行,然后使用sscanf()
解析它;这避免了换行符问题,并允许在数据中出现Mr O'Rourke的名字时重新解析该行。_ [ ...继续... ] _ - Jonathan Leffler%49[a-zA-Z -]
扫描字母、空格和破折号。如果数据中有P.J. O'Neil先生,将.
添加到列表中。请注意,破折号必须单独放在开头或结尾。这样就会导致那些名字带有重音符号的人无法读取(UTF-8会出现额外的问题)。否定的扫描集还允许数字和其他标点符号进入名称字段——这可能是一个重要的问题,也可能不是。垃圾进,垃圾出。 - Jonathan Leffler
% [...]
- Jonathan Leffler