输入输出问题

(1)输入-过滤

  • 输入“a = 1,b = 2”,分别赋值1,2
scanf("a = %d,b = %d", &a, &b);
scanf("%*c%*c%*c%*c %d %*c%*c%*c%*c%*c %d",&a, &b);
  • 输入“1 2 3”,分别赋值1,2
scanf("%d %*d %d",&a, &b);

(2)输入-字符串

  • getchar() VS scanf(“%c”) VS scanf(“%s”) VS gets()

getchar() :等效于scanf(“%c”),读入的是输入流中当前位置的字符

scanf(“%d”,&n); //输入67/(“/”代表回车),n=67,当前输入流的位置指向67之后,即回车符
c = getchar(); //c=‘\n’,在scanf读入一个非字符串的类型后,若要读入字符或字符数组,可用一个额外的getchar()把回车符读掉

gets():从当前位置读入一行字符串

scanf(“%d”,&n);
gets(str);//在scanf读入一个非字符串的类型后,若后面跟的不止一个回车符,可能还有多余的空格的话,可用gets()读掉

scanf(“%s”):其读入的时候是会忽略掉空格、回车和制表符,且以空格、回车或制表符作为字符串结束的标志。即其一定会等到所有空白符结束,直到它要等的字符串出现它才开始读取,在字符串出现前,出现的所有空白符都会忽略掉。

/*输入:第一行是一个整数,接下来每行的第一个是一个字符,用来表示某种操作,后面再跟一些数据,比如:
2
A 100 2
B 23
*/
char model[2];
scanf("%d",&n);
for(i=0;i<n;i++){
    scanf("%s",model);
    if(model[0]=='A'){scanf("%d%d",&a,&b);}
    else{scanf("%d",&a);}
    printf("%s %d %d\n",model,a,b);
}
  • getline() VS cin.getline() VS cin.get()

相同点:均读取一串字符串,常用来读取一行,且都可设置非换行的终结符

不同点:

cin.getline()和cin.get()

                前者读取空白符但忽略,常用于读取一行;后者发现空白符但不读取,继续留在缓冲区内,常用来读取一个字符,等效于getchar()

                C++ Primer Plus第五版p75中解释,get()使得输入更仔细,例如,你可以查看下一个字符,以确定是读完整行了呢,还是由于达到了你给出的个数限制

cin.getline()与getline()

                前者的输入针对c数组类型;后者针对string类型

                cin是istream的一个对象,cin.getline()中的getline()也就是istream的一个成员函数,在string被加入到c++很久以前,istream就已经存在了,所以,参数针对的是数组类型的存储,而没有string

(3)输出-特殊字符

单引号,双引号,和反斜杠的输出在前面加转义字符”\”,如:“\’” , “\”” , “\\”

%的输出用两个连在一起的%%,即printf(“%%”)

(4)输出-类型

double类型:用%lf

__int64类型( 64位整数):%I64d

long long类型:%lld

(5)输出-输出宽度和小数点后位数(或字符串截取长度)

%5.3lf:右对齐,格式宽度为5,保留小数点后3位

%-7.2s:左对齐,格式宽度为7,截取前2个字符

%g:自动选择%f和%e中的一种,根据输出的长短选择短的,有一个关键且广泛的应用,%g在输出时会自动删去double后面多余的0

(6)输出-cout和printf

切勿混用:cout带缓冲,而printf不带,混用会使得输出的数据顺序混乱

cout输出小数点后n位

#inlcude<iomanip>
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(n);

猜你喜欢

转载自blog.csdn.net/u013228808/article/details/83072833