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