一、字符数据输入输出函数
1.putchar(),输出一个字符:
#include <stdio.h>
int main() {
char cChar1, cChar2, cChar3, cChar4;
cChar1 = 'H';
cChar2 = 'E';
cChar3 = 'L';
cChar4 = 'O';
putchar(cChar1);
putchar(cChar2);
putchar(cChar3);
putchar(cChar3);
putchar(cChar4);
putchar('\n');
}
2.getchar(),输入一个字符:
#include <stdio.h>
int main() {
char cChar1,cChar2;
cChar1=getchar();
putchar(cChar1);
putchar('\n');
getchar();
cChar2=getchar();
putchar(cChar2);
putchar('\n');
return 0;
}
这里遇到了两个问题
①getchar()时输入法是默认中文的,所以想要得到结果就得输入字符+回车+回车,第一个回车是确认要输的字符,第二个回车才是getchar的结束确认,将输入法改为英文就可以避免这个问题。
②在输入时回车也算是一个字符,所以如果再次使用getchar()那么将直接获得这个回车。
二、字符串输入输出函数
1.puts
#include <stdio.h>
int main() {
char Char[] = "ILOVECHINA";
char* pChar = Char;
printf("%c%c%c%c\n", Char[1], pChar[1], *(Char + 1),*(pChar+1));
int len = sizeof(Char);
printf("%d\n", len);
printf("%p,%p,%p,%p,%p,%p\n", Char, pChar, &Char, Char + 1, pChar + 1, &Char + 1);
puts(pChar);
}
puts是以\0为结束标志的(字符串最后一个字符就是\0)
这里顺便验证了数组名与地址之间的一些关系:
数组名是数组开始的地址,也就是Char[0]的地址。
对数组名+1等价于对数组的起始地址+1等价于对数组的起始地址+sizeof(char)。
对数组名取地址得到的仍然是数组的起始地址,但是这个地址的基本单位为一个数组,也就是对该地址+1得到的是数组的起始地址+sizeof(Char)。
2.gets
#include <stdio.h>
int main() {
char sString[30];
gets_s(sString);
puts(sString);
char sString1[30];
gets_s(sString1);
puts(sString1);
}
这里测试了一下gets后是否需要用getchar吃掉回车,结果是不需要的
三、格式输入输出函数
1.printf(格式字符,输出列表)
格式字符 | 功能 |
---|---|
d/i | 带符号十进制整数 |
o | 无符号八进制整数 |
x/X | 无符号16进制整数,x用小写字母输出,X用大写字母输出 |
u | 无符号十进制整数 |
c | 输出一个字符 |
f | 输出字符串 |
%10s,若字符串大于10位,则正常输出,若字符串小于10位,则在左边补0,补满十位
%-10s,若字符串大于10位,则正常输出,若字符串小于10位,则在右边补0,补满十位
%10.3s,只取字符串左边3位输出,在左边补0,补满十位
%-10.3s,只取字符串左边3位输出,在右边补0,补满十位
2.scanf(格式控制,地址列表)
#include <stdio.h>
int main() {
char cChar[30];
char cChar1[30];
scanf_s("%s", &cChar,sizeof(cChar));
//putchar(getchar()); //去回车
scanf_s("%s", &cChar1,sizeof(cChar1));
printf("%s,%s", cChar,cChar);
}
scanf使用空白字符来分隔输入的数据,所以回车对scanf并没有影响。
scanf_s("%d,%d", &G->numVertexs,sizeof(int), &G->numEdges,sizeof(int));对于这种%d,%d,那么在输入数据的时候也只能用逗号分隔