我只想强制 scanf 读取单个空格,然后存储字符串的其余部分,直到在变量中找到逗号。我不能这样做:
char content[100];
fscanf(f, " %[^,\n],", content);
因为如果有未决的'\n'
,我不想设置content
。
有没有办法避开空白?
到目前为止我找到的解决方法:
char space;
fscanf(f, "%1[^\n]%[^,\n],", &space, content);
抱歉这个愚蠢的问题,提前谢谢你。
最佳答案
我假设您提供的代码比您的文字更能表达您的意图,而文字与细节不符。因为你说...
The workaround I've found so far:
char space; fscanf(f, "%1[^\n]%[^,\n],", &space, content);
...我的结论是该代码在您看来可以做您想做的事,并且我推断您将其指定为“解决方法”而不是完全令人满意的解决方案,因为需要 space
要涉及的变量。
事实上,情况比这更糟:每当 scanf()
成功匹配第一个字段时,它会通过越过 space
的边界来调用未定义的行为。发生这种情况是因为 [
字段描述符匹配非空的 strings,它们的内容后有一个终止符。但好消息是,摆脱对额外变量的需求(您似乎无论如何都想这样做)也将解决该问题。
最简单的方法是将赋值抑制修饰符 (*
) 应用于相应的字段描述符:
fscanf(f, "%*1[^\n]%[^,\n],", content);
请务必检查返回值以确定是否为 content
分配了任何内容。如果匹配到非空字符串并将其分配给content
(匹配后但未分配前导换行符),则为1
,-1
如果文件 f
最初位于其末尾或发生 I/O 错误,或者 0
如果在分配 content
之前发生匹配失败.
更新:
正如@chux 所观察到的,如果相应的数据比它所能容纳的更宽,则上面的scanf
格式无法防止content
超出范围。由于您将其声明为 100 个 char
的数组,它最多可以容纳 99 个字符和一个终止符,您可以确保它不会像这样溢出:
fscanf(f, "%*1[^\n]%99[^,\n],", content);
这使您有可能在看到换行符或逗号之前停止扫描,但是,返回值将无法帮助您将这种情况与完全成功的扫描区分开来。在这种情况下,下一个 扫描将产生匹配失败(假设使用相同的格式)。解决这个问题的方法不止一种,但您可以考虑从格式中省略尾随逗号,而是检查逗号并通过调用 fgetc()
单独使用它。
关于C:匹配scanf中的单个空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40241201/