按字母顺序排序单词

时间:2013-12-14 09:48:42

标签: c++ arrays string cstring

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

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;
}

3 个答案:

答案 0 :(得分:0)

在第

    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

答案 1 :(得分: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 ++标准)

  

通常的算术转换是在操作数上执行的   算术或枚举类型

另一方面,如果type char表现为signed 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;

答案 2 :(得分:0)

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