输入与输出函数
scanf()
%c
scanf("%c",&a) 格式:不丢弃缓冲区的各种字符,例如空格、回车等。
scanf(" %c",&a) 格式:丢弃已经停留在缓冲区中的空白字符,例如空格、回车等。
scanf("%c ",&a) 格式:丢弃因本次输入而停留在缓冲区的空白字符,例如空格、回车等。
scanf(" %c ",&a) 格式:结合以上两个特性。
%s
scanf("%s",a) 格式:丢弃缓冲区前面的空白字符,例如空格、回车等,但是遇到非空白字符后再遇到空白字符则直接退出输入,并且把空格及其以后字符留在缓冲区内,在字符串结尾加’\0’表示结尾,缓冲区结尾加上’\n’字符。
scanf("%s ",a) 格式:性质与上相同,不同点是遇到空格后丢弃缓冲区内空格及与其连续存在的空格,保留空格后的第一个非空白字符。
scanf(" %s",a) 格式:与第一种格式相同性质。
scanf(" %s ",a) 格式:与第二种格式相同性质。
%d
scanf("%d",&a) : 不读取所有空白字符,但是在缓冲区的最后会留下回车和空格等字符不丢弃。
scanf("%d ",&a) :不读取空白字符,在缓冲区的最后会丢弃留下来的回车和空格等字符。
总结
凡是在"%n"(n可以为任何)后面有空格,就会丢弃缓冲区内留下来的空格,凡是在其前面有空格就会丢弃原来缓冲区内前面的空格。
单独的%c会读取任何字符,使用时需要特别注意。
fgets()
fgets(char *a,maxsize,stdin/fp):例如fgets(a,5,stdin),读取4个字符,最后一位补’\0’,若输入不足4个字符,则在字符串末尾加’\n’,例如若输入不足:“123\n\0”。
getchar()
符串末尾加’\n’,例如若输入不足:“123\n\0”。
getchar()
接收一个字符,包括非空白字符。
数组指针与指针数组
指针数组
指针数组顾名思义就是储存指针的数组,本质上是个数组,存储的是地址,如:char *a[20];即能储存20个地址的指针数组,如果char b[]=“as5”;char c[]=“564”;即可以如此给a数组赋值:a[0]=b;即给a数组中下标为0的地方赋值为字符串b的地址,即字符串b中第一个字符的地址,可以通过此手段,给数组中赋值多个字符串,若打印a[0]即打印的是b字符串;若打印*a[0],即打印的是b字符串中的第一个字符,因为a[0]储存的是b中第一个字符的地址,通过这个地址能找到第一个字符,所以打印的是第一个字符。
数组指针
数组指针就是一个指向数组的指针,本质上是个指针,储存的是一个数组的地址
char (*a)[20];
我们可以理解为
char[20] (*a);
当然在编译器里不能这么写,这只是为了方便理解,以这个例子为例,a就是指向一个char[20]的数组,这里定义一个
char b[20];
如果要将数组b的地址给a,该怎么做?因为b的地址是它的第一个字符的地址,所以直接a=b吗?不当然不是,如果这样赋值,那直接就是把一个char类型的地址赋值给了a,如果a+1,这让它只往后移了一个char 类型大小的空间,但是a需要char[20]的地址,a+1应该要往后移一个char[20]大小的空间,所以我们应该这样赋值:
a=&b;
这样a才储存了数组b[20]的地址,打印一下*a,正好是b里面的内容。