c语言本身没有输入输出语句
格式化输出
%o :八进制
%x :十六进制
%d :十进制
%m.nf :输出的数字总共占有m个,其中n个为小数,在左边补零
%-m.nf :在右边补空格
%0md:在左边补上0得到m个数字
int main(){
printf("s1=*%5s*\n","chi");//s1=* chi*
printf("s1=*%-5s*\n","chi");//s1=*chi *
printf("s1=*%05s*\n","chi");//s1=*00chi*
printf("\n");
printf("s2=*%5d*\n",342);//s2=* 342*
printf("s2=*%5ld*\n",342);//s2=* 342*
printf("\n");
printf("s3=*%5d*\n",-342);//s3=* -342*
printf("s3=*%-5d*\n",-342);//s3=*-342 *
printf("s3=*%+5d*\n",-342);//s3=* -342*
printf("\n");
printf("s4=*%05d*\n",-342);//s4=*-0342*
printf("s4=*%+05d*\n",-342);//s4=*-0342*
printf("s4=*%-05d*\n",-342);//s4=*-342 *
printf("\n");
printf("s5=*%5o*\n",342);//s5=* 526*
printf("s5=*%#5o*\n",342);//s5=* 0526*
printf("s5=*%05o*\n",342);//s5=*00526*
printf("s5=*%+05o*\n",342);//s5=*00526*
}
%#x
%#x需要表明是八进制数还是十六进制
int main(){
int a=252;
printf("a=%o a=%#o\n",a,a);
printf("a=%x a=%#x\n",a,a);
}
# include <stdio.h>
int main(void)
{
int x=47; //47是十进制
printf("%x\n", x); //输出结果是: 2f
printf("%X\n", x); //输出结果是: 2F
printf("%#X\n", x); //输出结果是: 0X2F
printf("%#x\n", x); //输出结果是: 0x2f
return 0;
}
%+
int main()
{
double a=0.004;
double b=0.005;
double c=-0.004;
double d=-0.005;
printf("a=%.2f b=%.2f c=%.2f d=%.2f\n",a,b,c,d);
printf("a=%+.2f b=%+.2f c=%+.2f d=%+.2f\n",a,b,c,d);
return 0;
}
分析:
如果数字是正数,即输出+号
如果数字是负数,即先输出-号再输出绝对值
%e和%f
%e小数点后的有6个数,e+000总共占5个
%f可以四除五进
printf("%e\n",3.1415);
printf("%f\n",3.1415);
printf("%4.3f\n",3.1415);
printf的返回值
printf返回值是打印的字符的个数
int t=0;
while(printf("*")){
t++;
if(t>1)break;
} //**
printf("\n%d\n",t);//2
t=0;
while(printf("+")){
if(t++>1)break;
} //+++
printf("\n%d",t);//3
while(printf("")){//返回0
printf("hello");
}
printf遇到\0即停
char c[5]={'a','\0','b'};
printf("%s",c);
char a[]="c\0b";
printf("%s",a);
ASCII
printf("%d\n",'a');//97
printf("%d\n",'A');//65
printf("%d\n",'0');//48
字符串的输入
https://blog.csdn.net/lord12580/article/details/82109850
1.char *name;
2.char name[81];1,2 的不同点:
1.的指针在未进行初始化之前可能指向任何地方。
2.已分配了81个字节的地址。 char *name; scanf(“%s”,name); // 错误 会将输入的字符串拷贝到任何地方可能会擦写掉程序中的数据或代码。
为字符串分配内存后便可读入字符串
没搞懂这道题???
#include<stdio.h>
#include<math.h>
#include <string.h>
char fun(char *s){
char a[7];
s=a;
strcpy(a,"look");
}
int main(){
char *p=NULL;
fun(p);
puts(p);
return 0;
}
运行结果是不确定的值
scanf()函数。
弊端:只能读取一个单词。
原理:如果输入了空格会认为字符串结束,将空格后的字符作为下一个输入处理。
例如:
scanf("%s",name);
输入:aas df
会将aas放入地址中再在后面自动添加’\0’,并将df作为下一个输入处理。、
scanf中%c和%s的区别
对于%c来说 scanf()接收键盘输入的所有东西,遇回车结束输入 ,可以读入空格,句号。当scanf以%c接收一串字符时,每次只能接收一个字符,即单个字符。
可以得出%s读入字符串时:遇到空格,回车就会结束读入
char c1,c2,c3,c4,c5;
printf("输入\n");
scanf("%c%c",&c1,&c2);//a<回车>
c3=getchar();//b
c4=getchar();//空格
c5=getchar(); //c
printf("输出\n");
printf("%c,%c,%c,%c,%c\n",c1,c2,c3,c4,c5);//a,回车,b, ,c
printf("%d,%d,%d,%d,%d",c1,c2,c3,c4,c5);//97,10,98,32,99
char c6[10];
printf("\n输入\n");
scanf("%s",c6);//ab c
printf("%s*",c6);//ab*
2.gets()函数。
弊端:该函数只知道数组的开始处,并不知道数组的大小,如果输入的字符串过长容易溢出,可能擦写掉程序中的其他数据导致程序异常终止。
原理:读取整行的输入直至遇到换行符,然后丢弃换行符,储存其余字符,并在这些字符末尾添加一个空字符使其成为一个字符串。
3.fgets()函数。
gets()的参数只有数组的地址,而fgets()函数的参数有三个。
fgets(将要输入字符串的地址,读入字符的最大数量,要读入的文件)
通过第二个参数来限制读入字符的数量解决gets()的溢出的问题。
终止条件:①读入n-1个字符②遇到第一个换行符
原理:①终止在末尾添加一个空字符。
②终止保留换行符再在末尾添加一个空字符。
返回值:当读到文件末尾时返回空指针。
4.getchar()
char c;
while(c=getchar()){
printf("%c",c);
if(c=='\n') break;
}
getchar可以接受空格
char c;
printf("%d\n",'\n');
while(c=getchar()){
printf("%d\n",c);
if(c=='\n') break;
}
getchar()可以接受回车,即\n,其ascii为10
5.puts()
自动在后面加上\n
char *a="coda";
char b[100]="you are the best one.";
char *p;
p=strcpy(b+8,a);
puts(p);
puts(b);
puts(a);
char * strcpy(char *dst,const char *src)
{
if((dst==NULL)||(src==NULL))
return NULL;
char *ret = dst; //[1]
while ((*dst++=*src++)!='\0'); //[2]
return ret;//[3]
}