我是靠谱客的博主 清爽黑猫,最近开发中收集的这篇文章主要介绍C++国名排序之字符指针数组题目代码 总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目

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

想法一,

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

想法二,

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

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

题目:

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

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

代码

错误代码示例

#include<iostream>
#include<stdio.h>//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<<a[i]<<endl;

    return 0;
}

分析:

错误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<iostream>
#include<cstring>//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<<pname[i]<<" ";//这里不要用a[i],会按原来顺序输出

    return 0;
}

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

还可修改成

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

str1.compare(str2)  头文件#include<string>

输入输出

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>

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<iostream>
#include<string>
using namespace std;

int main()
{
    string str;
    str = "I love you";
    cout<<str.length()<<endl;//10
    str.clear();
    cout<<str<<endl;//输出换行

    str = "ugh so nasty!!!";
    str.insert(3," you are");
    cout<<str<<endl;//ugh you are so nasty!!!

    cout<<str.find('r')<<endl;//9

    str.replace(4,7,"please do not be");//空格也算字符串一部分
    cout<<str<<endl;//ugh please do not be so nasty!!!

    return 0;
}

输出

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球进了...姆巴佩很遗憾

爷青结

最后

以上就是清爽黑猫为你收集整理的C++国名排序之字符指针数组题目代码 总结的全部内容,希望文章能够帮你解决C++国名排序之字符指针数组题目代码 总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部