输入123456789给变量a1、a2、a3,宽度为3,然后输出a1、a2、a3,空格分隔。
输入格式:
123456789
输出格式:
输出为整型,空格分隔。
输入:
123456789
输出:
123 456 789
刚开始是想用数组解决这个问题的,但是后面发现输入只有一个,就是123456789,而不是依次输入,但是在按照数组分析的过程中,我发现,我连数组的初始化都不会了,所以又重新学习了一遍。
c++中数组的初始化的几种方法
1.初始化参数列表(最简单直接的方法)
全部初始化为0:int a[10]={0};
char str[10]="\0"; //等价于char str[10]={0};
初始化为其他值:int a[10]={0,1,2,3,4,5,6,7,8,9};
char str[10]="Hello"; //也可以写成char str[10]={'H','e','l','l','o','\0'}
如果初始化列表包含数组a的所有元素,可以省略数组的长度:int a[]={0,1,2,3,4,5,6,7,8,9};
2.使用循环语句初始化(1)若是单纯的想置数组为连续的整数,可以按照如下代码:
#include
using namespace std; int main(){ int a[10] = {0};//首先将数组置零 for( int i = 24 ; i < 34 ; i++ ){//假设存入数组的值是从24-33的这十个值 a[i] = i; printf("%d# ",a[i]); printf("%d@\n",i); } for( int i = 24 ; i < 34 ; i++ ){ //这里是直接将i传给a[i],所以输入输出的i的初值和条件必须是相同的,否则会出错 printf("%d ",a[i]); } } 若是想在循环中,进行数组初始化,可以按照如下思路:
#include
using namespace std; int main(){ int a[10] ; for(int i = 0 ; i < 10 ; i++){ scanf("%d",&a[i]); } for(int i = 0 ; i < 10 ; i++){ printf("%d ",a[i]); } return 0 ; }
上面的内容在这道题中并没有用到,所以就只当是复习了一下吧。下面进入正经的题目分析时间。
前面使用数组的方式行不通,那么要实现一次全部输入,然后将输入的数每一位分开使用的,就是字符串了,所以就要用到c++中的字符串长度的函数,即length()函数,使用这个函数需要首先定义一个字符串,例如:string a;那么要计算它的长度,就是a.length()。
所以整体的思路就是,定义一个字符串为123456789,然后设置循环变量i从0开始,如果循环变量i不为0(这里限制不为0是因为0除以3的余数为0,如果不限制的化会被认为是3的倍数,从而输出一个空格,所以要限制)且是三的倍数,那么就输出一个空格,按照这个思路,就可以解决这个问题。
#include
using namespace std;
int main( )
{
string a;
cin >> a;
for(int i = 0 ;i < a.length() ; i++){
if(i != 0 && i%3 == 0){
cout << " ";
}cout << a[i];
}
return 0;
}
输入字符串,然后输出前3个字符,要求占6列,右对齐。
输入格式:
输入字符串
输出格式:
输出字符串
输入:
Wendy
输出:
Wen
按照题目要求,首先需要自己输入一个字符串,然后截取这个字符串的前三位,然后右对齐输出。所以,需要截取字符串前几位的函数,还需要右对齐的函数。需要用到新的函数substr()函数。
substr(string,start<,length>)从字符串string 的start位置开始提取字符串,提取length长度的字符串。
若length为一下情况时,返回整个字符串的所有字符。
1、length不指定
2、length为负值
3、length大于字符串的长度//1、length不指定 //2、length为负值 //3、length大于字符串的长度 #include
using namespace std; int main(){ string a = "123456"; string str1 = a.substr(1); string str2 = a.substr(1,-3); string str3 = a.substr(1,10); cout << str1 << endl; cout << str2 << endl; cout << str3 << endl; return 0; } 因为字符串也是从0开始的,而我输入的start是1,所以从第二个字符"2"开始,下面换成0看看结果。
结果就是从第一个字符开始。
然后使用substr()函数从0开始输出字符串全部内容
#include
using namespace std; int main(){ string a = "123456"; string right1 = a.substr(0,5); cout << right1 << endl; return 0; } 按理说,字符串也是从0开始,那么按照上面这个代码结果应该是123456,但是,结果却并不是这样,而是下面这样:
这是因为substr(0,5)中的5表示长度,而不是字符串中的位数。这里是我疏忽了,要想输出全部,就应该改为substr(0,6)。
按照上述内容以及题目要求,就应该首先截取字符串前三位,然后将这三位右对齐,得到如下代码:
#include
using namespace std;
int main( )
{
string a ;
cin >> a;
string str = a.substr(0,3);
cout << setw(6) << right << str << endl;
return 0;
}
原本以为这样就可以满足题意了,但是结果如下:
这是为什么呢?我也不知道啊。
搜了一下别人的代码,发现区别就在于cin>>a和getline(cin,a)。
当缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin会将其忽略并清除,但当getline()读取数据时,不会像cin>>那样忽略第一个换行符,反而会直接读取,将换行符替换为空字符,所以当本题中输入字符串中有空格,比如a和b均为“11 234”,cin>>b和getline(cin,a)的对比如下:
#include
using namespace std;
int main( )
{
string a , b ;
cout << "使用getline :" << endl;
getline(cin,a);
cout << "使用cin :" << endl;
cin >> b;
string str = a.substr(0,3);
string str1 = b.substr(0,3);
cout << "使用getline :" << endl;
cout << setw(6) << right << str << endl;
cout << "使用cin :" << endl ;
cout << setw(6) << right << str1 << endl;
return 0;
}
结果如下:
cin>>与getline()区别:
cin>>接收一个字符串,遇“空格”、“TAB”、“回车”就结束;getline()接收一个字符串,可以接收空格并输出。
所以正确代码:
#include
using namespace std;
int main( )
{
string a ;
getline(cin,a);
//cin >> a;
string str = a.substr(0,3);
cout << setw(6) << right << str << endl;
return 0;
}
明天继续吧。