标签:字符 int scanf 输入输出 C++ 读入 printf 输入
I/O总结
1. 文件读入
有些图的题,数据量较大,适合文件读入(其实也用处不大……)
int main(){
//如果有oj系统(在线判定),则忽略文件读入,否则使用文件作为标准输入
#ifdef ONLINE_JUDGE
#else
freopen("data.txt", "r", stdin); //从data.txt输入数据
#endif
....
return 0;
}
在.cpp文件同文件夹下,创建一个名为data的txt文本存储输入数据即可
2. 关于scanf()和printf()
2-1 参数:
- 类型转换说明符:%d 、%lld、 %f、 %lf(没啥特别的,就是输入输出的格式)
- 转换说明修饰符(修饰1的,加在%和d中间),如:
修饰符 | 作用 |
---|---|
数字 | 指定宽度(若小于实际宽度自动向上补齐,见例2-1-1) |
x.y | 限制精度(同数字,x为整数部分位数,y位小数部分位数):输出有点用???这个待考证?? |
* | 对于scanf():抑制赋值,对printf():字符宽度通配符 |
- 对于printf():
修饰符 | 作用 |
---|---|
+ | 显示表示出+/-号:若为正,显示表示出+号 |
空格 | 正:符号位显示一个空格,负:-号 |
0 | 0填充 |
* | 指定字符宽度 |
- 对于scanf():
修饰符 | 作用 |
---|---|
* | 抑制输入,见例2-1-2 |
- 例2-1-1:
int main(){
int in, other;
scanf("%4d", &in); //输入:123、 123456789
printf("%d\n", in); //得到:123、 1234
scanf("%d", &other); //123:继续输入 、123456789:other直接接收剩余部分(56789)
printf("%d", other); //123456789:直接输出剩余部分
int out = 1234;
printf("|%2d|\n", out); //输出:|1234|
printf("|%5d|", out); //输出:| 1234|
return 0;
}
- 例2-1-2
int main(){
char s[5];
int in;
scanf("%*d %d", &in); //输入:123 12345
printf("|%*d|", 8, in); //得到:| 12345|
scanf("%*s %d", &in); //输入:abc 12345
printf("|%*d|", 8, in); //得到:| 12345|
return 0;
}
2-2 返回值:
- 关于scanf():
返回成功读入的项数,当遇到输入不匹配时,返回0
如果到了读取到了文件的末尾,则返回EOF:用于输入个数不固定的情况,如:例2-2-1
- 例2-2-1:
while(scanf("%d", &in) != EOF){} //一直读到最后
while(~scanf("%d", &in)){} //等价于上一种:因为EOF为-1(11111111)取反后就是0(00000000)
- 关于printf();
返回成功打印在屏幕的字符数:
int main(){
int x = 103;
char s[10] = "abcde";
cout << printf("%d %s", x, s); //输出:103 abcde9 -> 9:9个字符(空格换行也算,数字分割成digit)
return 0;
}
3. 字符、字符串:
3-1 字符:
- 读入单字符:
getchar();
输出单字符:putchar();
ch = getchar();
putchar(ch);
- 过滤掉空格、换行:
int main(){
char ch;
char valid[5];
//输出1:balabala this_is_valid
//输入2:| this_is_valid| 第一位为空格
while((ch = getchar()) != ' ') continue; //过滤掉空格:丢弃第一个空格之前的输入(跳过空格),同理可以过滤\n...
scanf("%s", valid);
//输出1:this_is_valid
//输出2:this_is_valid
printf("%s", valid);
return 0;
}
TIPS 1: 若用scanf(“%c”, &c);读入字符之前使用过scanf(),要注意用getchar()或cin.ingore()吸收掉之前的换行符 ‘\n’ (也是一个字符)
3-2 读入一行:
getline(cin, line);
关于geline()的返回值:getline (cin, stri)
返回cin,cin再转换为bool值true(读入成功)或者false(读入失败),见例 4-
4. 流输入输出:控制格式
4-1 sprintf()和sscanf():
TIPS 1: 只能用于char*,string要用.c_str()转化为char数组
sscanf()
:可以实现一次性的多个分割,如:
/*将字符数组str中的内容按"%d:%lf,%s"的格式写到int型变量n、double型变量db、char型数组变量str2中*/
int main(){
string line;
int father, child;
//输入:12 is the father of 3
getline(cin, line);
sscanf(line.c_str(), "%d is the father of %d", &father, &child);
//输出:father:12 child:3
cout << "father:" << father << " child:" << child;
return 0;
}
- 实现格式转换(而且可以控制格式),如:
sscanf(str, "%lf", &tmp);
//将str以浮点数形式写入tmp,若格式不符,不写入
sprintf(str, "%.2f", tmp);
//将tmp(浮点数形式)以.2f格式写入str,若tmp与.2f格式不匹配:如char tmp[]:输出0.00,但换成"%d"就输出 7405072不知道什么原理
4-2 stringstream:
- 作用:
-
比如读入一句话:想一个单词一个单词的处理(以空格为分割):
3 is my favorite number
-
想统一处理一行的数据(如求1 2 3 4 …的和、平均值之类的)
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string line;
//输入:3 is my favorite number
while(getline(cin,line)){ //注1:见3-2
string x;
stringstream ss(line);
while(ss>>x) {
//x每轮取一个单词:依次为:3、is、my...
cout << x;
}
}
return 0;
}
- 关于String:详细内容可参考:String(字符串不能撸)
标签:字符,int,scanf,输入输出,C++,读入,printf,输入 来源: https://blog.csdn.net/qq_42347617/article/details/100595045
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。