scanf gets

测试环境:   Linux

gcc:         线程模型 posix     4.6.3

 

  论点1: gets 吸收字符串,把缓冲区中的数据全部带走,并把一行的结束符‘\n’或者文件结束符‘EOF’转换为‘\0’

           经测试正确!

  论点2: scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的Space、Enter、Tab符(即回车符会残留在缓冲区中)

          经测试正确!

  论点3:scanf 如果是以字符形式输入,比如scanf("%c",&char), 则会读取所有字符,不会舍弃最后的Space、Enter、Tab

          经测试正确!

  论点4: 有人说,scanf()读取字符串会舍弃最后的回车符!

          经测试不正确!测试得到的结论更倾向于“scanf读取字符串时会将最开始的连续的Space,Enter,Tab清理掉,开始读入字符后,读到Space,Enter,Tab时返回,而此时的Space,Enter,Tab字符会依然残留在缓冲区中

      测试程序:分别用(1 2 3 4(Enter)),( 1 2 3 4(Enter)),( (Enter) 1 2 3 4(Enter)), ( (Enter)1 2 3 4 (Enter))可以得到上述结论。

      #include <stdio.h>
      void main( void )
    {       int integer;
              char string[81];
             /* Read each word as a string. */
             printf( "Enter a sentence of four words with scanf: " );
                for( integer = 0; integer < 4; integer++ )
                       {     
                                 scanf( "%s",string );
                                 printf( "%s\n", string );
                        }    
                   /* You must flush the input buffer before using gets. */

                   //fflush( stdin );

     while(getchar()!='\n');

                 printf("%d\n",getchar());
                 printf( "Enter the same sentence with gets: " );
                 gets( string );
                 printf( "%s\n", string );
    }

 

  论点四: fflush(stdin),可以用来清空缓冲区。

    在linux的gcc下测试无效!

    一段引用http://www.programfan.com/blog/article.asp?id=5796

    “也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);,把输入缓冲清空掉不就行了?”然而这是错的!CC++标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(gcc3.2不支持),因为标准中根本没有定义 fflush(stdin)MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standardfflush 操作输入流是对 C 标准的扩充)。

 

 

Others:

“回车”(carriage return,\r,0D)VS “换行”(line feed,\n,0A)

Unix系统里,每行结尾只有“<换行>”,即“\n” ;linux系统 结束符为$

Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”;C 系统 技术符为^M$

Mac系统里,每行结尾是“<回车>”,“\r”。

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

0D \r-回车,将当前位置移到本行开头。

0A \n-换行, 将位置移到下一行

“在微软的系统中,C程序处理文本是自动转换这两个符号的:  

  读的时候将   \r\n   自动当作一个字符   \n  
  写的时候写一个   \n   自动转换为   \r\n  
  造成一种误解,好象   \n   就是回车加换行”(未验证)

你可能感兴趣的:(scanf)