按字母顺序排列单词

Posted

技术标签:

【中文标题】按字母顺序排列单词【英文标题】:Alphabetically sorting the words 【发布时间】:2013-12-14 09:48:41 【问题描述】:

我通过将单词的第一个元素的 ascii 与另一个单词进行比较来对单词进行排序。我使用结构存储和数组存储 5 个单词,然后使用排序比较 asciis。我也想要它而不使用任何字符函数。我做错了什么?

编译器给出的错误:从 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;

【问题讨论】:

我们不会通知您您的错误。您告诉我们,我们会尽力帮助您消除它。 编译器给出的错误:从 char 到 int 的无效转换、无效的数组分配、预期在 int 之前的主表达式 所以using namespace std。那你为什么把它标记为c?这不是 C 代码。无论如何,解决一个微不足道的编译器错误超出了这里的范围。自己学习基本语法。 【参考方案1】:

此声明

    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&lt;char,20&gt;

例如(你需要包含标题

        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;

【讨论】:

非常感谢,它的工作原理只是告诉我 unsigned char 的使用,据我所知。 例如假设一个字符的代码(十六进制)是0x80,另一个字符的代码是0x50。您会希望代码为 0x50 的字符位于代码为 0x80 的字符之前。但是,代码为 0x80 的字符的值为负数,它将位于代码为 0x50 的字符之前。如果您将它们作为无符号字符进行比较,则值为 0x50 的字符将位于值为 0x80 的字符之前。 非常感谢,我明白了。【参考方案2】:

在一行

    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

【讨论】:

我试过了,但仍然给我错误,但比以前少了。错误如下:数组赋值无效,char到int的转换无效。【参考方案3】:

您还应该将 temp 的类型从 int 更改为 char,因为 name 是一个字符变量(从 char 到 int 的无效转换是由于此错误引起的)

【讨论】:

以上是关于按字母顺序排列单词的主要内容,如果未能解决你的问题,请参考以下文章

输入的单词是不是按字母顺序排列?

按字母顺序排列单词

尝试在c ++中按字母顺序排列单词时出现段错误

java中怎样把输入的基本英文单词按首字母顺序排列?

优化一个简单的缺失词算法[重复]

按字母顺序对HashMap程序的输出进行排序[重复]