C 语言中的输入输出:
1)格式输入:
scanf()
格式为scanf(“格式字符串”,输入列表) //不能规定精度,只能是原样输入
空白字符:Tab 回车 空格
scanf(" %c",c);//忽略掉全部的空白字符 (空格、回车、Tab)
若后面有空格,则必须输入非空白的字符才可以退出,因此不建议用。
eg:scanf("%d", &a);
scanf("%s", str); //遇到空白字符就会截断
scanf("%c", &ch); //接收任何字符,必须按照控制格式
scanf("%f", &f); //不能规定精度
键盘-->键盘缓冲区-->输入缓冲区-->scanf
如果输入缓冲区有数据,scanf直接读,如果没有数据,scanf等待(阻塞)
除了读字符c%,其他的读取都会自动忽略空白字符(空格,Tab,换行)
d%时若读入的是字符,则会出现死循环,是因为d%不会读取字符,而字符始终在输入缓冲区中。因此需要清空缓冲区,或者把变量赋初值。
清空输入缓冲区: scanf("%*[^\n]");//忽略掉第一个回车之前的
scanf("%*c");
* 表示禁止输入
printf()
内存数据-->输出缓冲区-->标准输出设备(显示器)
输出缓冲区中的数据在以下情况下会送到输出设备上:
1、程序结束时
2、输出换行时
3、缓冲区满时
4、有输入时
5、调用函数fflush()时
fflush(NULL)//参数为NULL时,清空所有的缓冲区
printf转换说明
% 标志 最小字段宽度 精度 长度修饰 转换说明符
标志
-左对齐(默认右对齐)
+有符号数总是以+,-号开始
#以0开头的八进制,以0x开头的十六进制
0用前导零填充
转换说明中的宽度和精度可以用*号表示,这时,宽度和精度的值通过转换下一个参数来计算,该参数必须为int.
如:printf("%.*s", max,s);
eg:
printf("%d", a);
printf("%s", str);//遇到结束符才结束
printf("%c", ch);
printf("%.2", f); //可定义精度
stdout 和stderr的区别:
1、stdout带缓冲区,stderr不带缓冲区
2、stdout可以重定向,stderr不可以重定向
3、什么时候stdout缓冲区会清空:
1)缓冲区清空时,缓冲区中的内容会送到显示器
2)当输出换行时清空
3)当等待用户输入时清空
4)当调用fflush函数时清空
5)当程序运行结束时清空
6)当缓冲区满时会清空
2) getchar() //用于从键盘接收一个字符,并返回回来
eg:char ch;
ch = getchar();
putchar() //用于输出一个字符到屏幕上
eg:putchar(ch);
getch() //用于从键盘接收一个字符,多用于暂停程序,输入任意字符后,程序继续执行
3) gets() //用于从键盘接收一个字符串,直到遇到回车停止接收,并且自动舍弃回车符
eg: char str[50] = {0};
gets(str);
puts() //用于输出一个字符串到屏幕上
eg: puts(str);
4) getc:从文件读字符,并返回回来
putc:把字符读到文件中去
ungetc:把刚读到的字符返还回去,主要是改变在文件中的指示器位置
5)
fread()://把文件的内容读到内存块中
fwrite()://把内存块的内容写到文件中去
6) IO(对文件进行输入和输出)
stdin (标准输入缓冲区)
stdout(标准输出缓冲区)
stderr(标准错误输出)//无缓冲区
7)
格式化输入和输出
scanf //从键盘(从输入缓冲区)
fscanf //从文件中读取
sscanf //从字符串中读取
printf
fprintf
eg:fprintf(stderr, "Error: data file can't be opened.\n");//打印错误信息
sprintf //将任何数据按照某形式转换成字符串
eg: char str[20];int i_arg = 12345;sprintf(buf,"%-6d",i_arg);
char str[20];double d_arg = 3.1415926;sprintf(str,"%6.2f",d_arg);
非格式化输入和输出
getc/putc 单个字符的输入和输出(文件)
getchar/putchar 单个字符(键盘和显示器)
gets/puts 字符串行的输入和输出(标准设备)
fgets/fputs 字符串行 (文件)
char *fgets(char *s, int n, FILE *stream);
从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。
形参注释:*s结果数据的首地址;n-1:一次读入数据块的长度,其默认值为1k,即1024;stream文件指针
fread/fwrite 字节的输入和输出(内存<-->文件)
fseek:文件当前定位
eg:
main()
{
char *s, m[20];
int i;
FILE *fp;
fp=fopen( "test.dat ", "r "); /*打开文字文件只读*/
fgets(s, 24, fp); /*从文件中读取23个字符*/
printf( "%s ", s); /*输出所读的字符串*/
fscanf(fp, "%d ", &i); /*读取整型数*/
printf( "%d ", i); /*输出所读整型数*/
putchar(fgetc(fp)); /*读取一个字符同时输出*/
fgets(m, 17, fp); /*读取16个字符*/
puts(m); /*输出所读字符串*/
fclose(fp); /*关闭文件*/
getch(); /*等待任一键*/
}
8)字符串的输入输出:
输出:
printf("%s\n", str);
printf("%.6s\n", str);//保留6个字符
//前面空5个空格,并打印5个字符,至少保证10个宽度,后面的数字表示打印多少个字符。
printf("%10.5s\n", str);
puts(str);
输入:
scanf("%s", str);
//当遇到空格,换行等空白字符时结束输入
gets(str);//读入一行字符,而且不会在开始读字符之前跳过空白,会持续读到换行为止,并且会自动忽略换行,不会把换行符留在缓冲区中,但是它取走后不会保存,会自动丢弃。若在该函数之前缓冲区中已经有东西,注意清空缓冲区。
9)
转移字符:
\n:换行
\r:回车
\t:水平制表
printf("格式字符串",...)
%i/%d int
%ld
%hd
%u
%lu
%f
%lf
%g
%e
%E
%% 打印%