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