我通过将单词第一个元素的ascii与另一个单词进行比较来对单词进行排序。我使用了结构来存储,使用了数组来存储5个单词,然后使用排序比较ASCII。此外,我希望它不使用任何字符函数。我做错了什么?
compilor给出的错误:从char到int的转换无效,数组赋值无效,在int 之前需要主表达式
#include <iostream>
#include <cctype>
#include <cstring>
using namespace std;
struct Words{
char name[20];
};
int main(){
Words words[5];
for(int i=0; i<5; i++){
cout<<"Enter the name"<<endl;
cin>>words[i].name;
}
int temp;
//sorting
for(int i=0; i<5; i++){
//ascii code
for(int j=0; j<4; j++){
if(words[j+1].(int)name[0]<words[j].(int)name[0]){
temp=words[j].name;
words[j].name=words[j+1].name;
words[j+1].name=temp;
}
}
}
cout<<endl;
//output
for(int i=0; i<5; i++){
cout<<words[i].name<<endl;
}
return 0;
}
此语句
if(words[j+1].(int)name[0]<words[j].(int)name[0]){
在语法上无效。正确的陈述看起来像
if( ( int )words[j+1].name[0]<( int )words[j].name[0]){
然而,制作这样的记录没有任何意义,因为(C++标准)
通常的算术转换是对的操作数执行的算术或枚举类型
另一方面,如果类型char表现为有符号的char,并且数组可以包含负值字符,则排序将无效。我建议以以下方式重写声明
if( ( unsigned char )words[j+1].name[0]<( unsigned char )words[j].name[0]){
这些语句也是无效的
temp=words[j].name;
words[j].name=words[j+1].name;
words[j+1].name=temp;
数组(变量temp应定义为char[20])没有赋值运算符。使用标准C函数strcpy或将数组定义为std::array<char,20>
例如(您需要包括标题
strcpy( temp, words[j].name );
strcpy( words[j].name, words[j+1].name );
strcpy( words[j+1].name, temp );
或者(您需要包括标题)
struct Words{
array<char, 20> name;
};
array<char, 20> temp;
temp=words[j].name;
words[j].name=words[j+1].name;
words[j+1].name=temp;
在行
if(words[j+1].(int)name[0]<words[j].(int)name[0]){
您试图使用错误的语法将成员变量从char
强制转换为int
。不能在成员访问点和成员名称之间写入强制转换。你必须把它写在要铸造的整个表达式前面:
if((int)words[j+1].name[0]<(int)words[j].name[0]){
此外,如果两个单词的第一个字符相同,但其他字符不同,您应该考虑该怎么办。如果您使用std::string
,您可以简单地比较这些字符串。顺便说一下,还有std::sort
。
您还应该将temp的类型从int更改为char,因为name是一个字符变量(从char到int的转换无效是由于此错误)