在c语言中,有过函数:
scanf("%c",&a);//1
scanf(" %c,&b);//2
scanf("%s",str);//3,str为数组
1从缓冲区读取单个字符,该字符可以是空白字符,回车符,如果是整数(1 2 3…)会将其解释为字符(‘1’,‘2’,‘3’…)。(回车结束)
当用%d或其他格式串读取时,都会跳过空白符。
2在格式控制串%c前面加了空格,则从缓冲区第一个非空白字符开始读取单个字符。(回车结束)
3从缓冲区读取第一个非空白字符开始读取字符串,但是遇到空白符(空格,制表符’\t’,回车换行符)会结束读取,在末尾加上’\0’使其成为字符串。(回车结束)
结束的换行符都会留在缓冲区
测试代码:
#include<stdio.h>
int main()
{
char a,b,c,d;
char ar[40];
int e=100;
scanf("%c",&a);
printf("%c\n",a);
printf("+++++++++++++++\n");
scanf("%s",ar);
printf("%s\n",ar);
printf("++++++++++++++++\n");
scanf("%c",&b);
printf("%c\n",b);
printf("++++++++++++++++\n");
scanf("%c",&c);
printf("%c\n",c);
printf("++++++++++++++++\n");
scanf("%c",&d);
printf("%c\n",d);
printf("++++++++++++++++\n");
scanf("%d",&e);
printf("%d\n",e);
}
结果:
zhanghang@Ubuntu-14:~$ ./a.out
awasd abcd
a
+++++++++++++++
wasd
++++++++++++++++
++++++++++++++++
a
++++++++++++++++
b
++++++++++++++++
100
zhanghang@Ubuntu-14:~$ ./a.out
wda
w
+++++++++++++++
da
++++++++++++++++
++++++++++++++++
++++++++++++++++
++++++++++++++++
40
40
int getchar(void);
int putchar(int c);
ch=getchar();
对应putchar(ch)打印字符ch
ch=getchar();从缓冲区读取一个字符,该字符可以是任意ASCII码值。类似scanf("%c",&a);多用于字符循环检测和清空缓冲区。
char *gets(char *s);
对应将字符串输出到屏幕函数:
int puts(const char *s);将字符串s输出到屏幕并换行,遇到空字符结束。
从标准输入中读取字符串放到数组s[]中,遇到换行符结束读取并丢弃换行符,加上’\0’字符使其成为字符串,返回数组首地址。该函数有一个最大的缺点:不能控制输入字符串大小。如果输入字符串比原数组大,会导致缓冲区溢出,编译器会抛错:Segmentation fault(程序试图访问未分配内存)。为了保证安全性,现在,这个函数很少用到。
char *fgets(char *s, int size, FILE *stream);
对应将字符串输出到屏幕函数:
int fputs(const char *s, FILE *stream);
将字符串输出到对应流(标准输出,文件等)不会换行。
函数fgets是函数gets的替代品,从文件流(可以是文件指针FILE *fp,标准输入输出流stdin,stdout)中读取字符串放到大小为size的数组s中,并返回数组首地址。
该函数解决了gets()函数对缓冲区溢出的问题。当输入字符串大于数组时,取字符串前size-1个字符放到s[]中并在s[]最后一个空间放置’\0’使其成为字符串;
(如果不放入’\0’字符,不能使用%s格式控制串打印)
该函数同样遇到换行符结束读取,但该函数会将换行符留在数组中。
将换行符留在数组有时会造成很大的不方便,可构造新的函数来消除换行符,代码如下:
char *s_gets(char *st,int n)
{
char *retval;
int i=0;
retval=fgets(st,n,stdin);//调用fgets函数从标准输入读取字符串
while(retval)
{
while(st[i]!='\n'&&st[i]!='\0')//检测st[i]处字符
i++;
if(st[i]=='\n')如果先遇到'\n',将其改为'\0'
st[i]=='\0';
else 如果遇到的是'\0',清空缓冲区
while(getchar()!='\n')
continue;
}
return retval;
}
另一个版本
char *s_gets(char *st,int n)
{
char *retval;
char *find;
retval=fgets(st,n,stdin);//调用fgets函数从标准输入读取字符串
while(retval)
{
find=strchr(st,'\n');
if(find)
*find='\0';
else
while(getchar()!='\n')
continue;
}
return retval;
}
int fgetc(FILE *stream);
int getc(FILE *stream);
fgetc从任意输入流读取一个字符,而getc是fgetc(stdin)的一个宏定义,只能从标准输入读取单个字符返回其ASCII码。
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
在fp所指向的文件中写入一个字符ch,成功返回其ASCII码,否则返回EOF(-1)
两函数功能用法一样。
函数前带有f的一般为文件I/O,而不带f的通常为标准I/O。文件I/O对标准I/O有包含。