0

私はojの問題を解決していました。vector<char*>しかし、突然、それが私の目的に合わないことがわかりました。私は何を間違っていますか?誰かがその問題を明確にしてくれたら... 問題の説明は簡単です。入力ファイルから単語を取り出して並べ替えるだけです。これが私がやったことですが、ソートされません:

vector<char*>V;
char str[501][201];
int l=0;
char str1[]= {'~','.','\n','\r',' ','!','@','#','$','%','^','&','*','(',')','+','-','_','=','{','}','[',']',':',';','"','<','>','?','/','|'};
while(gets(str[l++]))
{

    for(int i=0; str[l-1][i]; i++)
    {
        if(str[l-1][i]>='A' && str[l-1][i]<='Z')str[l-1][i]=str[l-1][i]-'A'+'a';
    }
    char *pch;
    pch=strtok(str[l-1],str1);
    while(pch!=NULL)
    {
        // printf("%s\n",pch);
        V.push_back(pch);
        pch=strtok(NULL,str1);
    }
}

sort(V.begin(),V.end());

for(vector<char*>::iterator it=V.begin(); it!=V.end(); it++)
    cout<<*it<<endl;
4

1 に答える 1

11

に適用するchar *と、<演算子 (sort()デフォルト) は、辞書順ではなく、ポインター値で並べ替えます。カスタム コンパレータを指定する必要があります。C++11 では、これはかなり簡単です。

sort(V.begin(), V.end(),
     [](char const * a, char const * b) { return strcmp(a, b) < 0; });

コンパイラがラムダをサポートしていない場合は、関数の外で適切なコンパレータを宣言する必要があります。

struct CStringLess {
    bool operator()(char const * a, char const * b) const {
        return strcmp(a, b) < 0;
    }
};
⋮
sort(V.begin(), V.end(), CStringLess());

もう 1 つの問題は、必要str1に応じて null で終了しないことですstrtok()。ただし、最後に追加するのではなく、C 文字列として再定義します。これはより簡潔で、無料で null ターミネータを提供します。

char * str1 = "~.\n\r !@#$%^&*()+-_={}[]:;\"<>?/|";
于 2013-06-23T11:39:40.407 に答える