C++和C输入输出和格式化输出

我们都知道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了。

参考文章:

https://baike.baidu.com/item/scanf/10773316?fr=aladdin

http://c.biancheng.net/view/275.html

原创文章 26 获赞 33 访问量 1924

猜你喜欢

转载自blog.csdn.net/qq_40765537/article/details/105162501