按字母顺序排列单词



我通过将单词第一个元素的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的转换无效是由于此错误)

最新更新