测试环境: 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);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(gcc3.2不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 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 就是回车加换行”(未验证)