我在该网站上看到::fscanf(fin, "%[^\n]", &p);
可用于从我的输入文件(fin
)读取到char类型的指针(*p
)中的所有字符,直到第一个输入命中为止。在某些输入下,它可以正常工作,但在其他输入上,则不能。
这是我应该处理的输入,但我不能:
(((zahar 100 ou 3) 5 unt 100 nuca 200) 4 (lapte 200 cacao 50 zahar 100)3)20
这是我的整个代码:
#include <string.h>
#include <stdio.h>
FILE *fin, *fout;
int main()
{
fin = fopen("reteta.in", "r");
fout = fopen("reteta.out", "w");
char *p;
p = new char[1001]();
fscanf(fin, "%[^\n]", &p);
fprintf(fout, "%s", &p);
return 0;
}
该%[
符号引入了一种称为“ scanset”的东西,有点像正则表达式(但功能不那么强大)。
在您的特定示例中,这意味着格式说明符指示scanf
保持扫描与除“”以外的任何\n
字符都匹配的字符(遇到不匹配的字符将终止扫描)。
根据C11标准:
转换说明符包括格式字符串中的所有后续字符,直至并包括匹配的右括号(])。括号之间的字符(扫描列表)构成了扫描集,除非左括号后面的字符是抑扬符(^),在这种情况下,扫描集包含了在抑扬符和右括号之间的列表中未出现的所有字符。
甚至将它与正则表达式进行比较也可以扩展它:标准只是简单地说:“从一组预期字符中匹配一个非空字符序列”。
Jonathan Leffler发现的代码真正的问题是:
fscanf(fin, "%[^\n]", &p);
^
删除,&
因为您要传递p,而不是“ p的地址”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句