2017-01-31 78 views
-1

我一直在試圖彎曲我的頭周圍這個問題一個星期了,但我似乎無法找到任何東西在線,我已經放棄了試圖解決它在我自己的。指向一個字符數組中的特定元素

我的任務是編寫一個程序,它將讀取文件中的名稱並接受來自用戶的新條目,然後對條目進行排序並將它們寫出到文件中。唯一的癥結是我必須在一個函數中對它們進行排序,並使用指針來這樣做。這個代碼應該用C++編寫,並使用字符數組。

我現在的代碼看起來像這樣。這是一個工作版本,唯一的問題是我不使用指針或函數來排序名稱。

#include<iostream> 
#include<cstdlib> 
#include<fstream> 
#include<cstring> 

bool sorted; 

using namespace std; 

int main() 
{ 
    int i = 0; 
    int numNames = 0; 
    ifstream ifs; 
    ifs.open("namn.txt"); 

    char c[20][20]; 

    if(ifs.is_open()) 
    { 
     while(!ifs.eof()) 
     { 
      ifs >> c[i]; 
      i++; 
     } 
    } 

    cout<<"How many names do you want to enter?"<<endl; 
    cin>>numNames; 

    for(int l = i-1; l<numNames+i-1; l++) 
    { 
     system("cls"); 
     cout<<"Enter a name: "; 
     cin>>c[l]; 
    } 
    while(sorted == false) 
    { 
     for(int j = 0; j<numNames+i-1; j++) 
     { 
      for(int k = j; k<numNames+i-1; k++) 
      { 
       if(c[j][0] > c[k][0]) 
       { 
        char snorre[20]; 
        strcpy(snorre,c[j]); 
        strcpy(c[j],c[k]); 
        strcpy(c[k],snorre); 
       } 
       else if(c[j][0] == c[k][0]) 
       { 
        if(c[j][1] > c[k][1]) 
        { 
         char snorre[20]; 
         strcpy(snorre,c[j]); 
         strcpy(c[j],c[k]); 
         strcpy(c[k],snorre); 
        } 
       } 
      } 
     } 
     cout<<endl<<endl<<endl; 
     ofstream ofs; 
     ofs.open("namn.txt"); 
     for(int o = 0; o<numNames+i-1; o++) 
     { 
      cout<<c[o]<<" "; 
      ofs<<c[o]<<endl; 
     } 
     ofs.close(); 
     system("pause"); 
     sorted = true; 
    } 
} 

所以希望有人能幫助我解決這個問題,提前致謝! :)

+0

http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered- WRO ng –

+0

我認爲如果字符串的前2個字符相同(和其他一些情況),則排序不起作用 –

+0

可能希望的答案是創建指向數組的指針,每個指向一個字符串,然後對指針進行排序,而不是使用'strcpy'。 (現代編碼標準是絕對可怕的,但聽起來你的任務自1985年以來一直沒有更新) –

回答

0

爲了讓您的代碼使用指針和功能,你可以做這個 - 你應該改變你的代碼,使之使用以下命令:

首先,從文件中獲取每個名稱到std::string ,使用getline(ifstream_object, std::string_object),供參考,參見here

使用.c_str()將每一個轉換爲const char *(在該示例中也顯示)。

對輸入的每個新名稱執行以下操作。

存放在此數組指針輸入的所有名稱:char *names[20];,像這樣:names[i] = name;

接下來,創建如function如下:

int location_of_bigger_string(const char* s1, const char* s2) 
{ 
    // Returns 1 if s1 should be before s2 and 2 otherwise 
    // This way, you use functions and pointers together. 
    // Use strcmp(s1,s2) here to determine returning value 
} 

strcmp(char*, char*) - 讀到它here

最後,所有字符串進行排序,使用qsort或本example.

+0

在'getline'和'string'之後,可以將字符串與關係運算符進行比較,並使用'sort'進行排序。 –

+0

令人驚歎的解釋!當我到達我的電腦時,會試試這個,目前正在回家的路上嘿嘿。 – Yoldrim

0

下面是完整的代碼,

注意,比較功能得到指針的元素,這裏的元素是指向自己,有啥傳遞到「比較」功能型「字符**」

{ 

#include "stdafx.h" 
#include<iostream> 

//retruns +1 if str1 > str2 alphabetically 
int compare(const void * a, const void * b) 
{ 
    const char * str1 = *((const char **)a); 
    const char * str2 = *((const char **)b); 

    int i; 
    for (i = 0 ; str1[i] && str2[i] ; i++) 
    { 
     if (str1[i] > str2[i]) 
     { 
      return +1; 
     } 
     else if (str1[i] < str2[i]) 
     { 
      return -1; 
     } 
    } 

    //one or both strings have ended 


    if (str1[i]) //str1 is longer 
     return +1; 
    else if (str2[i]) //str2 is longer 
     return -1; 
    else 
     return 0; 
} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char * names[]={"Zebra","Kousha","Koosha","Kou","Koush","Test"}; 

    qsort(names, 6, sizeof(char *), compare); 

    return 0; 
} 

} 
相關問題