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