C++国名排序之字符指针数组-创新互联

题目

请编程实现对n个国家的国名,按照字母顺序升序排序

成都网站建设、做网站,成都做网站公司-成都创新互联已向上1000家企业提供了,网站设计,网站制作,网络营销等服务!设计与技术结合,多年网站推广经验,合理的价格为您打造企业品质网站。

想法一,

用字符数组存储n个国家的国名,排序后输出

想法二,

用n行m列的二维数组(m为最长国名长度),排序后输出

上述两种方法都涉及到字符串的交换,每一个字符串,都要依次交换到另一字符串所在的空间中,极大地浪费了空间和运行效率

题目:

所以,请同学们用n行m列的二维数组存储n个国家的国名,然后用长度为n的字符指针数组存储国名首地址,对字符指针数组进行排序

输入n表示n个国家,再输入n行字符串表示对应国家国名

代码

错误代码示例

#include#include//scanf()
using namespace std;

int main()
{
    int n;
    cin>>n;//n个国名
    char a[n][50];//定义二维字符数组
    for(int i = 0; i< n; i++)
        scanf("%s", a[i]);//每个国名作为字符串输入

    char (*p)[50];//p为行指针
    p = a;//用二维数组的行地址初始化
    //int *p[50]则p为列指针
    string temp;
    for(int i = 0; i< n-1; i++)
    {
        if(a[i].compare(a[i+1]) >0)//这行报错了
        {
            temp = a[i];
            a[i] = a[i+1]
            a[i+1] = temp;
        }
    }
    for(int i = 0; i< n; i++)
        cout<

分析:

错误1

第19行报错 error: request for member 'compare' in 'a[i]', which is of non-class type 'char [50]' 

意思是a[i]并非string对象,无法对其使用成员函数compare。它相当于const char[50]这样的字符指针常量

错误2

第19~23行,代码直接对二维字符数组a进行排序但是a[i] = a[i + 1]和a[i + 1] = temp在这里是错误的

注意!这是个二维数组,不是一维,在一维数组中表示元素的a[i]和*p这些,在二维数组却表示一维中的数组首地址,也就是一维数组名。

此处表示用一维数组名a[i + 1]赋值给另一个一维数组名a[i],数组名不允许被赋值

正确代码:

#include#include//strcmp()
using namespace std;

int main()
{
    int n;
    cin>>n;//n个国名
    char a[n][50];//定义二维字符数组
    for(int i = 0; i< n; ++i)
        cin>>a[i];//每个国名作为字符串输入

    //定义字符指针数组pnames,用于存储国名首地址
    char *pname[n];
    for(int i = 0; i< n; ++i)
        pname[i] = a[i];//将国名首地址存入字符指针

    //用冒泡排序对字符指针数组进行排序
    for(int i = 0; i< n - 1; ++i)
        for(int j = 0; j< n - i - 1; ++j)
            if(strcmp(pname[j], pname[j + 1]) >0)
            {
                char *t = pname[j];
                pname[j] = pname[j + 1];
                pname[j + 1] = t;
            }

    for(int i = 0; i< n; ++i)
        cout<

第21行的if(strcmp(pname[j], pname[j + 1]) >0)

还可修改成

if((string(pname[j])).compare(pname[j + 1]) >0) 此处强制类型转换

str1.compare(str2)  头文件#include

输入输出

8
China
America
England
Russia
SouthKarea
NorthKarea
India
Austrilia
America Austrilia China England India NorthKarea Russia SouthKarea

头文件cstring中的strcmp(string1, string2)函数, 对两个字符串每个字符的ASCII值进行比较,若string1 >string2则返回正数,string1< string2返回负数,两字符串相等返回0

补充知识点:

1,C++中,字符串应该用" ",单个字符用' ',如果字符串用了' '可能会警告warning: character constant too long for its type,也可能会报错error: no match function for call to...

2,使用指针的优点:可直接操纵内存地址,提高编译效率,节省空间

3,cstring相当于C语言中的string.h,

而string头文件:

#include

string str = "abcd";

(1)str.length() 和 str.size()  返回字符串长度

(2)str.clear()  清空str中所有元素

(3)str.insert(n, str2)  在第n个位置(从0开始)插入str2

(4)str.find(str2)  返回子串第一次出现的位置,若不存在,返回-1

(5)str.replace(n, length, str2) 把字符串第n个位置(从0开始)长度为length的子串替换为str2

请看代码效果

#include#includeusing namespace std;

int main()
{
    string str;
    str = "I love you";
    cout<

输出

10

ugh you are so nasty!!!
9
ugh please do not be so nasty!!!
总结

指针确实很难,还老出错,所以迎难而上,难上加难呗
现在2022/12/19  1:21,还有24分钟加时赛结束

嗨起来

是点球大战 2022/12/19  1:46

法国第二球没进...

法国第三球没进...

阿根廷第4球进了...姆巴佩很遗憾

爷青结

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


新闻名称:C++国名排序之字符指针数组-创新互联
网页网址:http://scyanting.com/article/djssji.html