2013-12-14 147 views
-4

通過將單詞的第一個元素的ascii與另一個單詞進行比較來排序單詞。我用結構來存儲和一個數組來存儲5個單詞,然後使用排序比較asciis。另外我希望它不使用任何字符功能。我在做什麼錯?按字母順序排列單詞

誤差compilor是給:從字符到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

發佈您的錯誤 –

+1

We將不會通知您有關您的錯誤。你告訴我們,我們會盡力幫你解決這個問題。 – haccks

+0

編譯器給出的錯誤:從char到int的無效轉換,無效的數組賦值,預期的主表達式int – user3100177

回答

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表現爲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; 
+0

非常感謝,它告訴我使用無符號字符是我的知識。 – user3100177

+0

例如,假設一個字符(十六進制)的代碼是0x80,其他字符的代碼是0x50。你會希望代碼爲0x50的字符先於代碼爲0x80的字符。然而,代碼爲0x80的字符的值是負數,它將在代碼0x50之前的字符前面。如果您將它們作爲無符號字符進行比較,則值爲0x50的字符將在值爲0x80的字符前面。 –

+0

非常感謝,我明白了。 – user3100177

0

在線路

if(words[j+1].(int)name[0]<words[j].(int)name[0]){ 

嘗試施放一個成員變量從charint使用錯誤的語法。您不能在成員訪問點和成員名稱之間寫入演員表。你必須把它寫在整個表達式的前定投:

if((int)words[j+1].name[0]<(int)words[j].name[0]){ 

此外,你應該考慮到的情況下,做兩個詞有相同的第一個字符,但不同的除外。如果您使用std::string,則可以簡單比較這些字符串。順便說一句,有std::sort

+0

我試過這個,但仍然給我錯誤,但比以前少。錯誤如下:無效的數組賦值,從char到int的無效轉換。 – user3100177

0

還應該更改類型temp從int到char,因爲name是一個字符變量(從char到int的無效轉換是由於此錯誤造成的)

+0

是的,我糾正了我的錯誤。謝謝 – user3100177