c/c++语言开发共享scanf扫描后从输入中删除了什么?

我经历了很多问题,博客和书籍,但我想我无法正确地解决问题。 scanf扫描后做了什么? 它读取除了空格,制表符和换行符之外的所有内容,但它对换行有什么作用? 扫描输入后,我无法以任何方式删除换行符。 例如,将此视为输入: –


ABCDEFGH

现在,我已将5扫描为整数,

scanf("%d", &i); 

但是如何删除’ n’以便一次读取一个字符前面的所有内容? 我想用: –

  while((c=getchar())!='n'){//Do something} 

‘ n’应该是字符串之后的那个,但是getchar()在5之后得到一个并且循环在甚至运行一次之前终止。 我想我只是错过了一个小技巧。

 scanf("%d", &i); while((c=getchar())!='n'){ //Do something with the character } 

输入文件:-

ABCDEF
期待while循环运行,而它不运行。 因为它在5.之后捕获’ n’。我尝试在scanf()和while()之间添加getchar(),但是程序卡住并且什么都不做。

    如果在scanf格式说明符中的%d之后添加空格,则scanf在遇到任何非空白字符之前不会返回。 这将有效地消耗输入中的任意数量的换行符或其他空格。 正如@BlueMoon所指出的,请注意这依赖于程序在换行符后接收更多非空白输入。 所以它适用于这个例子,但可能在其他地方引起麻烦。

    这是一个最小的例子:

     #include  int main() { int i, j=0; char c; scanf("%d ", &i); while((c=getchar())!='n') printf("%d: %cn", j++, c); return 0; } 

    样本输入:

     5 abcdefg 

    输出:

     0: a 1: b 2: c 3: d 4: e 5: f 6: g 

    编辑 :请注意,通过使用fgets将行读入字符缓冲区,然后使用sscanf提取整数,可以避免此问题:

     char buff[SIZE]; fgets(buff, SIZE, stdin); sscanf(buff, "%d ", &i); while((c=getchar())!='n') printf("%d: %cn", j++, c); 

    fgets读取,直到遇到换行符或文件结尾,或者读取了SIZE-1字节。 假设您只希望该行包含一个整数,则此限制不应成为问题。 只要SIZE足够大,新行就会被fgets占用,循环中的后续getchar将按预期工作。

    由于您使用的是Windows,因此在'n'字符前面有一个'r' 'n'字符。

    “在你的while循环之前添加一个getchar(); ”技巧不起作用,因为这个getchar()获得了'r'字符。 因此,当首次评估while条件时, c'n'

    所以一个简单的修复就是使用两个getchar()调用来消耗'rn' 。 但是,这不是非常便携,也就是说,它不适用于其他系统。

    所以我会使用以下内容:

     int main() { int i; char c; scanf("%d", &i); if(getchar()=='r') getchar(); while((c=getchar())!='n') { printf("%cn", c); } return 0; } 

    如果您接受字符或字符串输入,请在每个整数输入后使用getchar() 。 这将从输入缓冲区中删除n

     scanf("%d", &i); getchar(); while((c=getchar())!='n'){//Do something} 

    您可以在scanf()调用之后立即使用getchar()来使用n以便它不会干扰您的循环。

     scanf("%d", &i); getchar(); // To consume the trailing newline left //in the input stream by scanf(). while((c=getchar())!='n'){ //Do something } 

     #include  int main(void) { int i, j=0; char c; scanf("%d", &i); getchar(); printf("%dn", i); while((c=getchar())!='n'){ printf("%c-", c); } return 0; } 

    我运行上面的代码与你一样: ./a.out < file Linux上的./a.out < file和使用mingw Windows,我没有看到任何问题。

      以上就是c/c++开发分享scanf扫描后从输入中删除了什么?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

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

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/518977.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐