我们都知道C++是C的增强版,目前一般的C++编译器都可以处理C代码和C++代码,所以在cpp文件中一样可以使用c语句,接下来我们来分析一下C和C++特有的输入输出语句的不同。
一、C语句
1. scanf("%format", &var) and printf("%format", var)
char str1[100];
int a;
//scanf读入字符串不可以读空格
scanf("%s", &str1);
//scanf函数返回值是读入的项数
printf("%s\n", str1);
//printf返回值是打印的个数
scanf("%s%d", &str1, &a);
如果str1是c++中的string类型,则无法使用scanf()读入,因为string非原生对象,不能直接使用scanf,printf
此外,scanf读入字符串不能读空格,即读到空格即停止,如果像读入含空格字符串,可以使用gets(), puts(),见下
scanf中f是format的缩写,更多的读入输出格式如下所示:
%c或%1c读入单字符,%2c读入、输出两个字符(后面不会加上空字节),以此类推。
%s读入、输出一个的字符序列,后面会加上空字节,遇到空白字符(\t \r \n 空格等)完成读取。
%d 读入、输出可选有符号十进制整数。
%u 读入、输出无符号符号十进制整数。
%i 读入、输出可选有符号整数。
%a,e,f,g,A,E,F,G 读入、输出可选有符号浮点数。
%o 读入、输出可选有符号八进制整数。
%x,X读入、输出可选有符号十六进制整数。
%p 读入、输出一个指针值。读入的字符序列应该与fprintf的%p产生的字符序列形式相同。
%n 不读入、输出任何字符,而是把到该位置已读入的字符数存储到与之对应的int*指向的位置。本转换说明符如果带有*或者带 有域宽信息(如:%*n或%3n等),则后果是未定义的。
2.putchar(var),getchar()
int c;
printf("Enter a value:");
c = getchar();
printf("the value you entered:");
int res = putchar(c);
printf("\n%d", res);
/*输出结果
Enter a value:c
the value you entered:c
99
*/
可见putchar返回值是字符的ASCII码,值得注意的是该函数只能处理一个字符
等价于scanf("%c", &c) 和printf("%c", c)
3.puts() , gets()
char str[100];
printf("Enter a string:");
gets(str);
printf("the string you entered:");
int res = puts(str);
printf("%d\n", res);
/*输出结果
Enter a string:abcdef
the string you entered:abcdef
0
*/
gets()函数当正常输入字符串时返回读入字符串的地址,否则返回none;puts()函数执行成功返回非负数,执行失败返回EOF。
等价于scanf("%s", &str) 和printf("%s", str)
4.循环读入,EOF结束
float b;
while(scanf("%f", &b) != EOF)
{
printf("%f", b);
}
EOF一般控制台是Ctrl+C或者Ctrl+Z
二、C++语句
C++语句就比较直接了当了,cin,cout搞定一切
1.简单输入输出
string str1;
cin>>str1;
cout<<str1<<" ";
char str[100];
cin.getline(str,100,'\n'); //整行读取
char ch = cin.get()
2.格式化输出
有如下规则:星号表示在没有使用任何算子的情况下,就等效于使用了该算子
操作流算子 | 作用 |
setw(w) | 指定输出宽度为 w 个字符,或输人字符串时读入 w 个字符 |
setfill(c) | 在指定输出宽度的情况下,输出的宽度不足时用字符 c 填充(默认情况是用空格填充) |
left | 左对齐,即在宽度不足时将填充字符添加到右边 |
*right | 右对齐,即在宽度不足时将填充字符添加到左边, |
----------------------------------------- | splitline ------------------------------------------------------- |
fixed | 以普通小数形式输出浮点数 |
scientific | 以科学计数法形式输出浮点数 |
setprecision(n) | 设置输出浮点数的精度为 n。 在使用非 fixed 且非 scientific 方式输出的情况下,n 即为有效数字最多的位数,如果有效数字位数超过 n,则小数部分四舍五人,或自动变为科学计 数法输出并保留一共 n 位有效数字。 在使用 fixed 方式和 scientific 方式输出的情况下,n 是小数点后面应保留的位数。 |
----------------------------------------- | splitline ------------------------------------------------------- |
*dec | 以十进制形式输出整数 |
hex | 以十六进制形式输出整数 |
oct | 以八进制形式输出整数 |
setbase(b) | 设置输出整数时的进制,b=8、10 或 16 |
----------------------------------------- | splitline ------------------------------------------------------- |
setiosflags(flag) | 将某个输出格式标志置为 1 |
resetiosflags(flag) | 将某个输出格式标志置为 0 |
值得注意的是,要使用这些操作流算子,需要引入iomanip头文件, 即#include<iomanip>
另外,setw()只作用于单次输出,但余下的作用于整个流对象
如果想清除setprecision可以直接恢复成默认精度6
例子:
cout<<setw(15)<<setfill('*')<<left<<123.456<<endl;
cout<<scientific<<setprecision(2)<<123.456<<endl;
cout<<fixed<<setprecision(1)<<123.456<<endl;
cout<<hex<<1234<<endl;
/*输出结果
123.456********
1.23e+002
123.5
4d2
*/
3.循环读入,EOF结束
int a=0;
while(cin>>a)
{
cout<<a<<endl;
}
三、总结
实际上打代码的话当然cin,cout比较简单,但是有的比较坑的oj题你会发现用cin,cout超内存,换printf,scanf就AC了。
参考文章: