输入输出
printf
标准格式输出,必须包含头文件#include <stdio.h>才能使用
函数原型
int printf(const char *format, ...);
基本用法
printf("字符串");
字符串里面的内容会原样输出
printf("字符串 格式控制串", 输出表 );
格式控制符
%d :以有符号数十进制输出
%u :以无符号数十进制输出
%o :以八进制输出
%x :以十六进制输出,a,b,c,d,e,f为小写字母
%X: 以十六进制输出,A, B, C, D, E, F为大写字母
%c :以字符的方式输出
%f :以浮点型的方式输出
%e :以科学计数法的方式输出浮点型数据
%g :以科学计数法和浮点数据其中最短的一种输出浮点数
%s :以字符串的方式输出
%p :输出地址
%%:输出%
#include <stdio.h> int main() { int a = 10; char b = 'A'; float pi = 3.14; char *p = "amazing";//p是一个指针变量,用来保存字符串常量的首地址 unsigned int c = -5; printf("a:%d\n", a); printf("b:%c\n", b); printf("pi:%f\n", pi); printf("p:%s\n", p); printf("-----------\n"); printf("c:%u\n", c); printf("0a:%o\n", a); printf("0xa:%x\n", a); printf("0Xa:%X\n", a); printf("----------\n"); printf("e pi:%e\n", pi); printf("g pi:%g\n", pi); printf("----------\n"); printf("p:%p\n", p); printf("%%\n"); return 0; } 结果: a:10 b:A pi:3.140000 p:amazing ----------- c:4294967291 0a:12 0xa:a 0Xa:A ---------- e pi:3.140000e+00 g pi:3.14 ---------- p:0x55a471881004 %
修饰符
#:用于修饰%o,%x,%X,为输出结果自动补全前缀
m:用于修饰%d,限制域宽,若域宽<m,则左补空格
-m:用于修饰%d,限制域宽,若域宽<m,则右补空格
.n:用于修饰%f,保留小数点后n位
l:用于修饰%d或者%f,来打印long类型和double类型
0:用于修饰%md,将域宽不够的地方用0补齐
#include <stdio.h> int main(int argc, char *argv[]) { int a = 48; int b = 97; float c = 3.832400; long d = 1234; short e = 12; printf("a:%d b:%d\n", a, b); printf("--------------\n"); printf("a:%#x\n", a); printf("a:%#o\n", a); printf("--------------\n"); printf("a:%6d b:%6d\n", a, b); printf("a:%-6d b:%-6d\n", a, b); printf("--------------\n"); printf("c:%f\n", c); printf("c:%.2f\n", c); printf("--------------\n"); printf("d:%ld\n", d); printf("e:%d\n", e); printf("a:%06d\n", a); return 0; } 结果: a:48 b:97 -------------- a:0x30 a:060 -------------- a: 48 b: 97 a:48 b:97 -------------- c:3.832400 c:3.83 -------------- d:1234 e:12 a:000048
输出表
与格式控制串一 一 对应的一系列常量或者变量,此表会将格式控制符一 一替换
putchar
单个字符输出
头文件:#include <stdio.h>
函数原型:int putchar(int c);
用法:
putchar(字符\char类型的变量进去)
putchar(ASCII码值)
注意:putchar输出单个字符不会进行换行操作
#include <stdio.h> int main(int argc, char *argv[]) { char a = 'S'; putchar(a); printf("\n"); putchar('a'); putchar('\n'); putchar(48); putchar('\n'); return 0; } 结果: S a 0
puts
字符串输出
头文件:#include <stdio.h>
函数原型:
int puts(const char *s);
注意:输出的字符串会自动换行
参数:
可以传一个字符串进去
可以传一个地址进去
#include <stdio.h> int main(int argc, char *argv[]) { puts("hello world"); char buf[10] = "amazing"; char *s = "traditional"; puts(buf); puts(s); return 0; } 结果: hello world amazing traditional
scanf
标准格式输入
头文件:#include <stdio.h>
函数原型:
int scanf(const char *format, ...);
用法:
scanf("格式控制串", 地址表);
传递地址表时,普通变量要加&符号
&:
& + 变量 -->取该变量的地址
格式控制符
%d :以有符号数十进制输入
%u :以无符号数十进制输入
%o :以八进制输入
%x :以十六进制输入,a,b,c,d,e,f为小写字母
%X: 以十六进制输入,A, B, C, D, E, F为大写字母
%c :以字符的方式输入
%f :以浮点型的方式输入
%e :以科学计数法的方式输入浮点型数据
%s :以字符串的方式输入
%i :自动识别输入的是十进制,十六进制,八进制(输入时必须加上前缀)
%[]:用于输入字符串,只能识别[]里面的内容,遇到不能识别的内容则结束输入,如果[^],则除了[]里面的内容都能识别
例:
%[1]只能识别字符1 %[1-9]只能识别字符1-9 %[^1-9]除了1-9不能识别,其他的都能识别 如果想让scanf识别空格和tab 则:%[^\n],这样子scanf除了换行符都能识别
%*抑制符
吃掉所对应位置的内容
例:
%*c就可以吃掉所对应位置的脏字符
#include <stdio.h> int main(int argc, char *argv[]) { /* int a = 0; scanf("%d", &a); printf("a:%d\n", a); char b = 0; scanf("%c", &b); putchar(b); char arr[10] = {0}; scanf("%s", arr); puts(arr); */ /* int c = 0; scanf("%i", &c); printf("c:%d\n", c); */ /* char buf[10] = {0}; scanf("%[1-9]", buf); puts(buf); */ char e = 0; char f = 0; scanf("%c%*c%c", &e, &f); putchar(e); putchar('\n'); putchar(f); putchar('\n'); return 0; }
getchar
获取单个字符
头文件:#include <stdio.h>
函数原型:
int getchar(void);
用法:
定义一个char类型变量来接受getchar从键盘上获取的字符
char a = getchar();
#include <stdio.h> int main(int argc, char *argv[]) { char a = 'a'; a = getchar(); putchar(a); putchar('\n'); return 0; } 结果: h h
gets
从键盘上获取字符串
头文件:#include <stdio.h>
函数原型:
char *gets(char *s);
用法:
gets(地址)
将从键盘上获取的字符串保存到该地址中
危险性:gets没有设定获取字符串的上限,容易因为非法访问内存而产生段错误
*** stack smashing detected ***: terminated 已放弃 (核心已转储) 注:这个是段错误,常常因为非法访问内存而导致
#include <stdio.h> int main(int argc, char *argv[]) { char a[10] = {0}; gets(a); putchar('\n'); puts(a); return 0; } 结果: 12345 12345