输入输出专题
printf
char ch=65;
%c--A %d---65
- printf的常用修饰符
int i=255;
char ch[size]="helloworld";
printf("i=%#o,i=%#x,i=%+d\n",i,i,i);
printf("ch=%010.5s",ch);//有警告 %s时0补位不管用,%-10.5%s是👉靠齐
- gcc编译器预定义宏(FILE,FUNCTION,LINE)用于输出跟踪代码,定位代码行
printf("[%s:%d] while before.\n",__func__,__LINE__);
while(1);
printf("[%s:%d] while after.\n",__func__,__LINE__);
scanf
- scanf----1------%s
char str[size];
int i,j;
//-------------危险慎用!!!!!
scanf("%s",str);//1.不用str取地址 2.遇到 空格,TAB,回车 代表结束。(hello world)只输出(hello)
//3.当size=3时,默认你只可输入 he(√) hello(×),但是---程序跑起来看着hello对了,其实你已越界了。
printf("%s\n",str);
scanf("%d%d",&i,&j);//1.遇到 空格,TAB,回车 不代表结束。
printf("%d,%d\n",i,j);
- scanf----2--------循环
//循环中用scanf易崩程序,得判错(返回值--成功返回的个数)
int i;
while(1)
{
printf("please enter: ");
int ret=scanf("%d",&i);//a时,code未崩。
if(ret!=1)
{
printf("Enter err\n");
break;
}
printf("%d\n",i);
}
- scanf----3----抑制符
//连续输入慎用
int i;
char ch;
printf("please enter: ");
scanf("%d %c",&i,&ch);
printf("i=%d,ch=%c\n",i,ch);
/*-----------------------------------------------------*/
please enter: 12 c
i=12,ch=c
/*-----------------------------------------------------*/
scanf("%d%c",&i,&ch);
printf("i=%d,ch=%c\n",i,ch);
printf("i=%d,ch=%d\n",i,ch);
/*-----------------------------------------------------*/
please enter: 12 c
i=12,ch=
i=12,ch=32
/*-----------------------------------------------------*/
上述情况1
//吃字符的解决办法
/*-------------------------1--------------------------*/
scanf("%d%*c%c",&i,&ch);//仅能抑制一个字符
/*-------------------------2--------------------------*/
getchar();//仅能吃掉一个字符
getchar/putcahr
int ch;
ch=getchar();
putchar(ch);//不会自动换行
putts/gets
//gets----危险----有超出数组限制,乱占其他内存风险
char str[size];
gets(str);
puts(str);
//事实上gets只能读size-1个字符,默认尾加'\0',同时遇到换行就结束.
空格=32,TAB=9,enter(回车)=10,,三类字符 ↩︎