C:匹配scanf中的单个空格

标签 c

我只想强制 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/

相关文章:

c - 在 Linux 上使用 gcc 并在 Windows 上使用 MinGW 构建共享库

c - 读取和附加到同一个文件

c - linux中的信号量操作,收到SIGSEGV和segmentation fault,哪一部分出错了?

c++ - 这三种说法有什么区别?

c - 初学者问题)如何永久更改变量的类型?

c - FFT 和卷积

c - 汇编到 C 代码跳转

c - 如何将此 C 代码转换为汇编 IA32?

c - 如何在 posix_openpt() 中定义名称

c - Swift 中释放 C-malloc() 内存?