您的位置:首页 > 编程语言 > C语言/C++

c语言输入输出函数总结

2016-07-14 15:05 330 查看
常见的输入输出函数如下,下面分别介绍:

getchar()   //从键盘上输入一个字符常量,此常量就是该函数返回的值;
putchar()  //把变量中的一个字符常量输出;
scanf()     //从键盘上输入各类数据,并存放到程序变量中;
printf()    //把键盘中的各类数据,加以格式控制输出;
gets()      //读入一行字符串常量并放到程序的数组中;
puts()      //把数组变量中的一个字符串常量输出,并且带有回车'\n';
sscanf()    //从一个字符串中提取各类数据到buffer; 
sprintf()   //将各类数据写入字符串中;


1.格式化输出函数printf()

它是向标准设备输出格式化标准的信息,它的原型是:printf(“格式化字符串”,“参量表”);格式化字符串可分为两部分:一是正常字符,会按原样输出,二是格式化规定字符,以%+规定字符来规定输出内容的格式

参量表里面是各种输出变量,用“,”隔开,与格式化规定字符一一对应,数目必须一样。

格式化字符串

%d 十进制有符号整数

%u 十进制无符号整数

%f 浮点数

%s 字符串

%c 单个字符

%e 指数形式的浮点数

%0 无符号以八进制表示的整数

%g 自动选择合适的表示法

说明: (1). 可以在”%”和字母之间插进数字表示最大场宽。

(2). 可以在”%”和字母之间加小写字母l, 表示输出的是长型数( %ld 表示输出long整数 %lf 表示输出double浮点数 )

一些特殊规定字符
\n                   换行
\f                   清屏并换页
\r                   回车
\t                   Tab符


2.格式化输入函数scanf()

它的原型是 int scanf(“格式化字符串”,“参量表”);成功返回读入的数据项数,失败则返回EOF,第一个参数和printf一样,第二个参数是读一个地址,int 型的需加&,是表示地址的字符串数组本身表示地址,不用加&。

例如:

scanf(“%d%d%d”,&a,&b,&c);

&a,&b,&c中的&是寻址操作符,如果scanf中%d是连着写的,如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔,只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”,如“2,3,4”。

注意事项

(1)在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符,包括空格,回车\n.若有,则是按规则输入。

如:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{

char c1,c2,c3;
scanf("%c%c%c",&c1,&c2,&c3);
printf("%c\t%c\t%c\n",c1,c2,c3);
return 0;
}


输入\n结果是:

[root@localhost gongxiang]# ./a.out
a
b
a
b


输入空格结果是:

[root@localhost gongxiang]# ./a.out
a b c
a               b


这是因为把a后面的空格回车当作字符赋给了c2,当输完b后的回车scanf就结束了。如果是scanf(“%c %c %c”,&c1,&c2,&c3);则可以输入空格,同理,回车也可以。

有没有可以解决这个问题呢,答案是肯定的

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char  c1,c2;
scanf("%c",&c1);
getchar();
scanf("%c",&c2);
printf("%c  %c\n",c1,c2);
return 0;
}


结果为:

[root@localhost gongxiang]# ./a.out
a c
a  c


由getchar()接收a后的空格即可

(2)在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12x”时,x即为非法数据)时即认为该数据结束。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{

int c1,c2,c3;
scanf("%d%d%d",&c1,&c2,&c3);
printf("%d\t%d\t%d\n",c1,c2,c3);
return 0;
}


输出结果为:

[root@localhost gongxiang]# ./a.out
12 23 34
12      23      34


当遇到空格就认为就一个参数输入结束,舍弃空格,开始接受下一个,这是跟输入字符不一样的地方。

(3) scanf中要求给出变量地址,给出变量名则会出错,如 scanf(“%d”,a);是非法的,应改为scanf(“%d”,&a);才是合法的。 对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上”&”操作符。

(4) 可以在格式化字符串中的”%”各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。但是 scanf函数中没有类似printf的精度控制。如: scanf(“%5.2f”,&a); 是非法的。

(5) 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{

char c1,c2,c3;
scanf("%c,%c,%c",&c1,&c2,&c3);
printf("%c\t%c\t%c\n",c1,c2,c3);
return 0;
}


[root@localhost gongxiang]# ./a.out
a,b,c
a       b       c


(6)输入为字符串时,也是在格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12x”时,x即为非法数据)时即认为该数据结束。

下面请看一个例子:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{

char  str[20];
char  str1[20];
char  str2[20];
scanf("%s",&str);
printf("%s\n",str);
scanf("%s",&str1);
scanf("%s",&str2);
printf("%s\n",str1);
printf("%s\n",str2);
return 0;
}


在终端运行时结果:

[root@localhost gongxiang]# ./a.out
I love you
I
love
you


从结果可以看出,输入字符串时,当遇到空格结束扫描,str里只存放了I,当再定义两个数组去存放时,不需要再输入了,这是因为输入的字符串放在了stdin流中,当下一次遇到scanf时,会直接从输入流中取出数据。

那有没有什么方法可以解决呢,只需要用%[…..]即可,这个用的很少,但是很有用

上面的例子可以改为:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{

char  str[20];
scanf("%[^\n]",&str);   [^\n]是指scanf接收除了\n之外的一切字符
printf("%s\n",str);
return 0;
}


结果为:

[root@localhost gongxiang]# ./a.out
I love you
I love you


3.单个字符输入函数getchar(),输出函数putchar()

char getchar(char) 从键盘输入一个数据,返回输入的数据,getchar也会将回车,空格,等读进去。跟用scanf输入单个字符一样。

putchar(ch) 单个字符输出函数,其中ch可以是一个字符变量或常量,也可以是一个转义字符。

这两个比较简单,就不多说

4.字符串输入函数gets(),输出函数puts()

char *gets(char *s); gets函数可以无上限的从键盘读入数据,直到遇到换行或者EOF为止,存进s所指的缓冲区中,这就需要缓冲区足够大,否则会溢出,溢出的数据会存到堆栈中,会对数据产生很大的影响,最后会舍弃读入的\n,会被自动转化为\0,所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。EOF对应的值是-1.

int puts(char *string); puts()函数用来向标准输出设备(屏幕)写字符串并换行,遇到\0结束,puts()与gets()相反,puts会把接收到的字符串最后一个\0转化成换行

(1). puts()函数只能输出字符串, 不能输出数值或进行格式变换。 (2). 可以将字符串直接写入puts()函数中。如: puts(“Hello, Turbo C2.0”);

5.字符串格式化函数sprintf()

把格式化的数据写入某个字符串缓冲区。

int sprintf( char *buffer, const char *format, [ argument] … );

参数列表

buffer:char型指针,指向将要写入的字符串的缓冲区。

format:格式化字符串。与printf()函数一样。

返回值

返回写入buffer 的字符数,出错则返回-1. 如果 buffer 或 format 是空指针,不出错而继续,函数将返回-1,并且 errno 会被设置为 EINVAL。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char  buffer[1024];
int count=sprintf(buffer,"this is a buffer %s","12345678");
printf("buffer=%s ,count=%d\n",buffer,count);
char  str[18]="abcdefg";
count=sprintf(buffer,"this is a buffer2 %s",str);
printf("buffer=%s ,count=%d\n",buffer,count);
return 0;
}


运行看结果:

[root@localhost gongxiang]# ./a.out
buffer=this is a buffer 12345678 ,count=25
buffer=this is a buffer2 abcdefg ,count=25


scanf()是与sprintf()相反的过程,从缓冲区取数据到相应的结构,用的不多,这里就不多说了,相信大家都已经理解了吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: