2017-01-31 11 views
-1

私は今この問題を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; 
    } 
} 

誰かがこの問題で私を助けることができたので、あらかじめありがとう!

まずstd::stringにファイルからそれぞれの名前を取得します:あなたのコードを変更すると、それは次のように使用するべきであるthis- :)

+0

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

+0

文字列に最初の2文字が同じ(そして他のいくつかの場合) –

+0

の場合、ソートがうまくいかないと思うでしょう。おそらく、意図した答えは、それぞれが1つの文字列を指しているポインタの配列を作成し、 'strcpy'を使わないでください。 (これは現代のコーディング基準ではひどいですが、あなたの割り当てが1985年以来更新されていないように思えます) –

答えて

0

はポインタと関数を使用するようにコードを取得するには、行うことができます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

あなたはそれを自分で解決する方が良いと思うので、完成したコードを追加しませんでした。 –

+0

すばらしい説明!私は自分の家に帰る途中で、私のコンピュータに着いたらこれを試してみる。 – Yoldrim

0

を使用し、すべての文字列をソートするには、ここでは、関数は要素へのポインタを取得します比較は、ここに要素が自身のポインタであることを完全なコード、

注意ですそう、「比較」に渡されているものの機能は、「**のchar」型である

{ 

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

} 
関連する問題