公 告

欢迎各位网友添加友情链接,在您添加本博客:http://linux0818.blogspot.com/ 做为链接后, E-mail:linux0818@gmail.com给我,我将将您的网址添加到本博客。

2008年10月14日星期二

getch()和scanf()结束符的去处

大家都知道getch()和scanf()在输入完后有一个'\0'结束符,可这个结束符会不会跟数据一起放到缓存中呢?看下面的实例 就知道啦:
#include<stdio.h>
int main(int agrgc,char **argv)
{
char ch,ch1,ch2,ch3;
ch = getchar();
ch1 = getchar();
printf("/*******************************************************************************/\n");
printf("getchar1 = %c,getchar2 = %c",ch,ch1);
scanf("%c",&ch2);
ch3 = getchar();
printf("scanf = %c,getchar scanf = %c",ch2,ch3);
printf("/*******************************************************************************/\n");
return 0;
}

在linux下用gcc编译下运行就有如下结果了:
/*******************************************************************************/
gdlc@gdlc-desktop:/mydata/my_c_script/chain$ ./a.out
1
getchar1 = 1,getchar2 =
c
scanf = c,getchar scanf =
/*******************************************************************************/

这说明,'\0'会一起到缓存中去,然而在一些连续两次用到输入的时候,那么下一次读出来的就是'\0'了,这样就得到了一个我们不想要的结果,如下例:
#include<stdio.h>
int main(int agrgc,char **argv)
{
printf("/*******************************************************************************/\n");
char ch,ch1;
printf("请输入字符:\n");
ch = getchar();
printf("getchar1 = %c\n",ch);
printf("请输入字符:\n");
ch1 = getchar();
printf("getchar2 = %c\n",ch1);
printf("/*******************************************************************************/\n");
return 0;
}

结果如下:
gdlc@gdlc-desktop:/mydata/my_c_script/chain$ ./a.out
/*******************************************************************************/
请输入字符:
a
getchar1 = a
请输入字符:
getchar2 =

/*******************************************************************************/
这样得到getchar2就不是用户输入的结果了,再看下例:
#include<stdio.h>
int main(int agrgc,char **argv)
{
printf("/*******************************************************************************/\n");
char ch,ch1;
printf("请输入字符:\n");
ch = getchar();
getchar();
printf("getchar1 = %c\n",ch);
printf("请输入字符:\n");
ch1 = getchar();
printf("getchar2 = %c\n",ch1);
printf("/*******************************************************************************/\n");
return 0;
}
结果如下:
gdlc@gdlc-desktop:/mydata/my_c_script/chain$ ./a.out
/*******************************************************************************/
请输入字符:
a
getchar1 = a
请输入字符:
b
getchar2 = b
/*******************************************************************************/
这样在第一次getchar()后面加上getchar()而不给它赋值,把它取走,这样就不会影响到我们的程序了,别人问题小,挺整人的。


下面是输入输出函数的一些特性,可以通过例子来看:
#include <stdio.h>
int main(int argc,char **argv)
{
char ch[10];
/*char str[10];//测试gets()和scanf()时可将后面的printf()和puts()测试项注释,反之亦然

printf("Please Input a string less ten char(using the gets() function):");
gets(str);//输入字符串时,中间可有空格,空格后的字符串也能输出,结束以\0为结束符
printf("The string is(using the gets() function):\n%s\n",str);

printf("Please Input a string less ten char(using the scanf() function):");
scanf("%s",str);//输入字符串时,中间不能有空格,有空格时空格后面的字符串不显示输出
printf("The string is(using the scanf()  function):\n%s\n",str);*/

printf("Please Input a string less ten char(using the gets() function input):");
gets(ch);
printf("The string is(using the printf() function output:%s\n",ch);//一次可输出多个字符串,遇到结束符\0时并不转换为\n而换行

printf("Please Input a string less ten char(using the gets() function input):");
gets(ch);
printf("The string is(using the puts() function output:\n");
puts(ch);//一次只能输出一个字符串,遇到结束符\0时转换为\n而换行
return 0;
}

--
/**************************************/
Name: Xiong Feng
E-mail:linux0818@gmail.com
MSN:linux0818@hotmail.com
QQ:23562033
Address: GuangZhou.China
/**************************************/

没有评论:

发表评论