c/c++语言开发共享我需要解释fscanf参数

您好我需要更好地解释fscanf参数。 我有以下文本文件

this is line 1 this is line 2 this is line 3 ... 

读出我做的

 for(int i=0;i<2;++i){ test[255]; fscanf(fp,"%[n]",test); printf("%sn",test); } now I get: this is line 1 this is line 1 with "%[^n]n" I get this is line 1 this is line 2 

现在我根据我的理解将我的陈述分开:%表示读取未格式化(%s会给我一个字符串%c单个字符…)[^ n]直到你得到的东西在这种情况下不匹配新队

你能解释一下方括号的function和终止吗? 我阅读了官方解释,但没有完全理解。

扩展1:我的问题。 我知道有更多易于使用的选项来实现我的目标。 但我只是想了解fscanf的语法。

扩展2:当我理解正确的时候

 fscanf(fp,"%[^n]%*c",test) 

读取直到换行并跳过下一个换行符。 遵循此逻辑,%[^ n]将是除换行符之外的每个字符。 我可以写

 for(int i=0;i<2;++i){ test[255]; fscanf(fp,"%[az]",test); printf("%sn",test); } 

我希望得到

 this is 

但我明白了

 ٷ  ٷ  

扩展3问题不重复scanf()将新行char留在缓冲区中,因为我想读取一个完整的行

    使用scanf系列函数可以解释输入流中剩余的内容。 格式说明符%[^n]使用字符类 (不是'n' )来读取换行符 – 允许使用空格输入字符串。 字符类 (例如[...] )匹配括号内的字符, '^'作为字符类中的第一个字符反转匹配 。 转换完成后, 'n'行结束将保留在输入缓冲区中。

    由于字符串转换在遇到换行符时结束,而不删除保留在输入缓冲区中的'n' ,因此下一次读取尝试终止而不读取任何字符(输入失败), test的值保持不变(保持第一行的值)所以当你再次打印它时,你会得到同样的东西。

    来自man 3 scanf

     s Matches a sequence of non-white-space characters; ... The input string stops at white space or at the maximum field width, whichever occurs first. [ Matches a nonempty sequence of characters from the specified set of accepted characters; ... The usual skip of leading white space is suppressed. 

    当您更改格式字符串以包含换行符( "%[^n]n" )时,您只需删除剩余的换行符。 因此,您下次尝试阅读时会看到第二行的第一个字符并且读取正确。 您还可以使用( "%[^n]%*c" )使用分配抑制运算符'*'来读取和丢弃字符类后面的下一个字符。

    这个陷阱(没有考虑保留在输入缓冲区中的字符)是鼓励新C程序员使用fgets (或POSIX getline )进行面向行的输入的主要原因之一,因为这两个函数都读取(包括)他们填充的缓冲区中的换行符 – 消除了将其留下未读的可能性 – 只是等待下次读取时出现问题。

      以上就是c/c++开发分享我需要解释fscanf参数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(计算机技术网)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/549257.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐