1、背景
最近刷题过程中,发觉自己对于输入、输出相当不了解,本身也不常用这些。现在想来错过一个亿。因此,从网络中搜集了一些数据,并测试后总结如下。
2、输入
2.1 输入可调用
2.2 scanf的使用技巧
函数原型
#include <stdio.h>
int scanf(const char *format, ...);
scanf()是C语言中格式输入函数,
根据format中的转化符,在format后添加地址,方便把从读取到的字符按照转换类型转化为所规定的格式,然后把它放入到输入变量中。即输入类型要与占位符(转化符)相一致。
format中包括转化符和普通字符
2.2.1 注意点1、输入字符的前导空格
如scanf("%c", &c); 如果你输入" a"(a前面有一个空格),此时空格就被c接收了。
因此为了避免空格输入、换行、tab的误操作,,在format中添加一个前导空格。
即scan(" %c", &c);
2.2.2 注意点2、输入十六进制数
scanf("%x", &num); 输入0x或0X 或不输入,均可识别;
2.2.3注意点3、在format中使用正则表达式
char str[100] = {0};
char tripstr[100] = {0};
scanf("%[a-zA-Z0-9]", str); //匹配[]内的字符; 遇到非集合内的字符时立即终止输入。
scnaf("%[^abc]",tripstr); //^表示求反集
2.2.4 注意点4、scanf返回值
成功,函数返回成功匹配和分配的item数
失败,第一个遇到了错误或文件尾,则返回EOF(-1);第一个就没匹配上,则返回0;
2.2.5 注意点5、遇到什么结束
scanf("%d", &num);
遇到第一个不匹配的就直接结束;返回匹配
scanf("%s", buff); //遇到第一个非空格字符开始记录,到回车结束,‘\n‘转为‘\0’。
scanf("[a-z 0-9A-Z]", buffer); //遇到匹配的开始记录,到回车结束;但是只记录到遇到不匹配之前的,可接受空格
2.2.6 注意点6 使用*读入不存功能
scanf("%d%^c%d", &a, &b);
2.3 fgets的技巧
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
If a newline is read, it is stored into the buffer.
fgets()从stream中读取至多size个字符存入s中。读操作由EOF或换行结束。注意读取一行时,‘\n’会被读入,且在末尾添加'\0'作为字符串结束符。
因此此时用strlen(s);读取s字符串的长度,则其中包含'\n'.
2.4 getline的技巧
#include <stdio.h>
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
The buffer is null-termi‐nated and includes the newline character, if one was found.
getline() 从stream中读取完整一行,存入*lineptr中。同样换行符'\n'和结束符'\0'在*lineptr中。