NOIP学习小站
西安交通大学附属中学航天学校

字符串例题——字符串数组

问题:输入\(n\)(\(1 \le n \le 1000\))位小组成员姓名(姓名中只有英文字符,每个姓名不超过10个字符),逆序输出所有姓名。

分析:使用string数组存储所有成员姓名,然后逆序输出数组中的string即可。

#include<iostream>
#include<string>
using namespace std;
string names[1000]; 
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>names[i];
    }
    for(int i=n-1;i>=0;i--){
        cout<<names[i]<<endl;
    }
    return 0; 
}

此外,如果用字符数组存储所有姓名,需要使用二维数组。此时二维char数组的每一行是一个字符串(一位成员的姓名)。

#include<iostream>
#include<cstring>
using namespace std; 
char names[1000][15];
int main()
{
    int n,len;
    cin>>n;
    for(int i=0;i<n;i++){
        //names[i]是二维char数组的第i行,用来存储一个字符串 
        cin>>names[i];
    }
    for(int i=n-1;i>=0;i--){
        cout<<names[i]<<endl;
    }
    return 0; 
}

问题变形:输入的姓名中可以出现空格。结合前面小节的内容可知,如果使用string存储姓名,那么需要用getline函数输入姓名;如果使用char数组存储姓名,那么可以使用fgets函数输入姓名。

#include<iostream>
#include<string>
using namespace std;
string names[1000]; 
int main()
{
    int n;
    cin>>n;
    getchar();   //不要忘了这一句,否则后面输入字符串会出现异常 
    for(int i=0;i<n;i++){
        getline(cin,names[i]);
    }
    for(int i=n-1;i>=0;i--){
        cout<<names[i]<<endl;
    }
    return 0; 
}
#include<iostream>
#include<cstring>
using namespace std; 
char names[1000][15];
int main()
{
    int n,len;
    cin>>n;
    getchar();   //不要忘了这一句,否则后面输入字符串会出现异常 
    for(int i=0;i<n;i++){
        //names[i]是二维char数组的第i行,用来存储一个字符串 
        fgets(names[i],sizeof(names[i]),stdin);
        int len = strlen(names[i]);
    	//处理末尾可能额外附带的'\n'
    	if(len && names[i][len-1]=='\n') names[i][--len] = '\0';
    }
    for(int i=n-1;i>=0;i--){
        cout<<names[i]<<endl;
    }
    return 0; 
}