1. printf函数格式控制
变量类型 | 控制格式 | 用法示例 |
char | %c(字符),%d显示整数 | printf("%c\n",a); |
short | %十进d(整数) | printf("%d\n",a); |
int | %d(十进制整数) | printf("%d\n",a); |
int | %nd(十进制整数,占n个字符位置,不足补充空) | printf("%3d\n",a); |
int | %-nd(十进制整数,-代表左对齐) | printf("%-4d\n",a) |
int | %0nd(十进制整数,占n个字符位置,不足补充0) | printf("%04d\n",a); |
int | %#o(八进制整数,#显示八进制前缀0) | printf("%#o\n",a); |
int | %#x(十六进制整数,#显示十六进制前缀0x) | printf("%#x\n",a); |
unsigned int | %u(无符号,十进制显示数据) | printf("%u\n",a); |
long | %ld,%#lo(八进制),%#lx(十六进制) | printf("%ld\n",a); |
long long | %lld,%#llo,%#llx | printf("%lld\n",a); |
float | %f(显示小数点后6位,显示小数点后两位%.2f) | printf("%.2f\n",a); |
float | %g(显示小数点后有效位) | printf("%g\n",a) |
float | %e(指数的格式显示小数) | printf("%e\n",a); |
double | %lf(显示小数点后6位,显示小数点后两位%.2lf) | printf("%lf\n",a); |
int a;获取a的地址&a | %p(打印地址) | printf("%p\n",&a); |
char arr[20] ="hello world"; | %s,%10s ,%-10s | printf("%s\n",arr); |
#include <stdio.h>
int main(int argc, const char *argv[])
{
printf("%2d-%02d-%02d %02d:%02d:%02d\n",2024,2,27,15,4,23);
//2024-01-03 15:19:03
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
int i,j;
for(i=1;i<10;i++){
for(j=1;j<=i;j++){
printf("%-2d*%2d=%-3d ",j,i,i*j);
if(j%i==0){
printf("\n");
}
}
}
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
float pi=3.123456789;
printf("pi=%f\n",pi);
printf("pi=%.2f\n",pi);
printf("pi=%e\n",pi);//指数形式显示
printf("pi=%g\n",pi);//显示小数点后有效位
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
int a=10;
printf("&a=%p &a=%ld\n",&a,(unsigned long)&a);
printf("&a=%p &a=%#lo\n",&a,(unsigned long)&a);
printf("&a=%p &a=%#lx\n",&a,(unsigned long)&a);
//%#lx控制格式对应的是数值
//&a是一个地址,地址和值不能直接划等号,所以这里需要强制类型转换
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
//char ch[10]={"im lili!"};
char ch[10]="lili huahu";
printf("ch=%s\n",ch);
//将字符数组内的字符显示到终端上,遇到'\0'结束。
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
char name[50] = "zhangsan";
int age = 20;
float score=99.8;
char sex = 'm';
printf("name:%s\tage:%-2d\nscore:%.2f\tsex:%c\n",name,age,score,sex);
return 0;
}
2. 输入缓冲区介绍
当一个程序无论用哪个函数进行输入时,都会给程序分配缓冲区,也就是一段内存。这个缓冲区分为输入输出缓冲区。输出缓冲区可以用来配合低速读设备。而程序也会把每一个输入字符读到缓冲区当中,直到读到换行符号等情况,程序会刷新缓冲区。由于输入缓冲区的存在,所以要在输入时格外注意输入的垃圾字符的吸收。
3. scanf输入控制
类型 | 控制格式 | 用法 |
char | %c | scanf("%c",&a);向程序输入一个字符 |
int | %d | scanf("%d",&a);向程序输入一个整数 |
int | %4d | scanf("%4d",&a);向程序输入整数,整数的宽度是4 |
unsigned int | %u | scanf("%u",&a);向程序输入一个无符号整数 |
long | %ld | scanf("%ld",&a);向程序输入一个long整数 |
long long | %lld | scanf("%lld",&a);向程序输入一个long long整数 |
float | %f | scanf("%f",&a);向程序输入一个浮点数 |
double | %lf | scanf("%lf",&a);向程序输入一个浮点数 |
char a[20]; | %s | scanf("%s",a);a是数组名,又是数组的首地址,所以这里不需要取地址符号 |
char a[20]; | %[^\n] | scanf("%[^\n]",a);表示除了'\n'之外的所有字符都输入到数组中,遇到'\n'停止 |
# include<stdio.h>
int main(int argc, const char *argv[])
{
char ch;
scanf("%c",&ch);
printf("ch=%c\n",ch);
printf("ch=%#x\n",ch);
printf("ch=%d\n",ch);
return 0;
}
// a
// ch=a
// ch=0x61
// ch=97
# include<stdio.h>
int main(int argc, const char *argv[])
{
printf("请输入小写字母:");
char ch;
scanf("%c",&ch);
while(!(ch>96&&ch<123)){
scanf("%c",&ch);
}
printf("%c\n",ch-32);
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
int a;
printf("input>");
scanf("%d",&a);
printf("a=%d\n",a);
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
int num;
printf("input>");
scanf("%d",&num);
while(!(num>99&num<1000)){
scanf("%d",&num);
}
int dex=num/100;
int ox=(num-100*dex)/10;// ox= num%100/10;
int ge=num%10;
printf("ge=%d ox=%d dex=%d\n",ge,ox,dex);
return 0;
//要哪一位上的数字,就先取高位模再除该位权
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
float pi;
printf("input the value of pi>");
scanf("%f",&pi);
printf("pi=%g\n",pi);
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
//输入字符串
char ch[50];
printf("input>");
scanf("%s",ch);//%s在输入字符串的时候遇到空格,Tab,换行都会停止
printf("%s\n",ch);
/*
printf("input>");
scanf("%c",ch);
printf("%s\n",ch);这样写后面显示的是脏数据
*/
//错误用法:printf("%s\n",ch[1]);
//正确用法:printf("%c\n",ch[1]);
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
char ch[50];
printf("input>");
scanf("%[^\r]",ch);
//scanf("%[^\'a']",ch);
//%[^\n]:表示除了'\n'之外的所有的字符都输入到arr数组中
printf("ch=%s\n",ch);
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
printf("input>");
int a;
//测试tab 空格 换行符 对输入是否有影响
// scanf(" %d",&a);
//scanf("\n%d",&a);
// scanf(" %d",&a);
//以上符号放在格式控制符前无影响
// scanf("%d ",&a);
// scanf("%d\n",&a);
scanf(" %d",&a);
//在控制格式后加空格,Tab,换行对输入是有影响的,必须输入一个任意字符程序才能结束
//所以在使用scanf的时候后面不要写空格,Tab,换行。
printf("a=%d\n",a);
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
int sex;
char age;
//scanf("%d%c",&sex,&age);
printf("age>");
scanf("%d",&age);
printf("sex>");
scanf("%d",&sex);
scanf("%*c%c",&sex);//%*c吃掉一个任意字符
//当输入完年龄后会敲入回车,这个回车符会被后面的scanf当作输入,从而未到输入就结束运行。
//另外,这种情况发生是因为后一个输入是字符类型,会把回车给吃了。
printf("sex:%d,age:%d\n",sex,age);
return 0;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
char sex;
int age;
printf("input sex> ");
scanf("%c",&sex);
printf("input age> ");
scanf("%d",&age);
//%d在读取整数的时候,如果前面有空格,Tab,换行对整数输入没有影响
printf("age = %d,sex = %c\n",age,sex);
return 0;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
char sex;
int age;
printf("input age,sex> ");
scanf("%d,%c",&age,&sex);
//控制格式是什么,输入就必须按照对应的格式进行
//12,s
printf("age = %d,sex = %c\n",age,sex);
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
char name[50];
char sex;
int age;
printf("input>");
//scanf("%s",name);
scanf("%*c%[^\n]",name);//后面输入字符务必要注意垃圾刨除字符
scanf("%c",&sex);
scanf("%d",&age);
printf("name=%s,sex=%c,age=%d\n",name,sex,age);
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
char name[50];
char sex;
int age;
printf("input>");
//1)控制格式中如果有逗号,会把所有的字符都读到name中
// scanf("%c,%c,%d",name,&sex,&age);
//2)如下格式正确:
// scanf("%s %c %d",name,&sex,&age);
scanf("%[^\n] %c %d",name,&sex,&age);
//3)对于这种写法,在输入name后需要敲回车
//输入sex和age后都要敲回车
printf("%s %c %d\n",name,sex,age);
return 0;
}
scanf函数输入总结:
- 当前有多个输入且后面输入中有输入字符时,应当用%*c吸收垃圾字符。
- scanf输入格式严格按照前边的格式规定输入,两个格式控制符之间有逗号或空格就必须输入空格。
- 可以用%[^\n]控制全部敲回车后输入。
- 控制格式中不能有逗号,否则会把多个输入当成一个输入,可用空格。
- 格式控制符后边若有字符则会对输入结束条件有影响,必须输入该字符表示输入结束。
4. getchar函数
用法:1.输入一个字符。2.吸收垃圾字符
# include<stdio.h>
int main(int argc, const char *argv[])
{
char ch;
ch=getchar();
printf("ch=%c\n",ch);
return 0;
}
# include<stdio.h>
int main(int argc, const char *argv[])
{
char sex;
char name;
printf("input>");
scanf("%c",&sex);
getchar();//吃掉缓冲区中的'\n'垃圾字符的
printf("input>");
scanf("%c",&name);
name=getchar();
getchar();//吃掉缓冲区中的'\n'垃圾字符的
printf("name:%c sex:%c\n",name,sex);
return 0;
}
5. purtchar函数
putchar(ch);
功能:将ch字符输出到终端上
# include<stdio.h>
int main(int argc, const char *argv[])
{
char ch;
ch=getchar();//获取一个字符
putchar(ch);//用法1.输出字符变量
putchar('\x41');//用法2.输出十六进制字符常量
putchar(10);//用法3.输出十进制字符常量,10对应换行符
putchar('\101');//用法4.输出八进制字符常量
putchar(10);
putchar('A');//用法5.直接输出字符常量
putchar(10);
putchar(getchar());//用法6.
getchar();
putchar(10);
return 0;
}
6. gets函数
gets(字符数组名)
功能:从终端上读取字符串放到字符数组中,会在结尾补充'\0',gets函数支持输入空格和Tab,gets不会对越界进行检查,所以使用的使用注意数组成员的个数。
# include<stdio.h>
int main(int argc, const char *argv[])
{
char ch[50];
gets(ch);
//从终端上读取一个字符串放到s数组中,会在结尾补充'\0'
//编译的时候这个函数会报警告,这个警告暂时忽略
printf("%s\n",ch);
return 0;
}
7. puts函数
puts(数组名或字符串);
功能:将字符串打印到终端上,这个函数在输出完字符串之后会自动加'\n'换行符
# include<stdio.h>
int main(int argc, const char *argv[])
{
char s[100];
gets(s);//从终端上读取字符串放到s数组中,gets会将缓冲区中的'\n'读走替换成'\0'
puts(s);//1)将s中的字符串打印到终端上,会在结尾自动加'\n'
puts("hello everyone !!");//2)
puts("");//3)输出换行符,等价于putchar(10),等价于printf("\n");
return 0;
}