-3

3文字以上から始まるすべてのユーザー名を配列の先頭に配置し、3文字未満のすべてのユーザー名を配置するソート機能があります

if(wcslen((WCHAR*)playerNames[i]) < 3)

(すべて「-」になります)を一番下に置き、に置き換え<Unknown>ます。私は次のことを試しましたが、クラッシュ"-"すると奇妙なデバッガーの値を設定します。"<Unknown>"

char* playerNames[30] = { "Player1", "Player2", "Player3", "Player4", "Player5", "Player6", "-", "Player7", "-", "-", "-", "-", "Player8", "Player9", "Player10", "Player11", "Player12", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "Player14", "Player15" };
void sort(){
    char* sorted[29];
    int slot = 0;
    for (int i = 0; i < 30; i++){
        if (playerNames[i] != "-"){
            if (i == slot){
                sorted[slot] = playerNames[i];
            }
            else {
                sorted[i] = playerNames[i];
            }
            slot++;
        }
        else if (playerNames[i] == "-"){
            slot++;
        }
    }
    for (int i = 0; i < 30; i++){
        if (wcslen((WCHAR*)sorted[i]) < 3){
            sorted[i] = "<Unknown>";
        }
        playerNames[i] = sorted[i];
    }
}

これは戻るはずです

Player1
Player2
Player3
Player4
Player5
Player6
Player7
Player8
Player9
Player10
Player11
Player12
Player13
Player14
Player15
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>
<Unknown>

編集:次のことを試しましたが、まだ動作しません:

void sort(){
    char* sorted[30];
    int slot = 0;
    for (int i = 0; i < 30; i++){
        if (strcmp(playerNames[i], "-") != 0){
            if (i == slot){
                sorted[slot] = playerNames[i];
            }
            else {
                sorted[i] = playerNames[i];
            }
            slot++;
        }
        else if (playerNames[i] == "-"){
            slot++;
        }
    }
    for (int i = 0; i < 30; i++){
        if (strlen(sorted[i]) < 3){
            sorted[i] = "<Unknown>";
        }
        playerNames[i] = sorted[i];
    }
}
4

1 に答える 1

1

ここに問題が 1 つあります。値の比較ではなくポインターの比較を実行しているためif (playerNames[i] != "-"){、ブランチは実行されません (C++ は Javascript や C# とは異なります)。文字列のメモリアドレスをリテラル文字列のtrueアドレスと比較しています。playerNames"-"

また、いくつかの他のポイント:

  1. C++ で C スタイルのキャストを使用しないでください。C++ キャスト演算子 ( static_castdynamic_castまたはreinterpret_cast必要に応じて代わりに) を使用します。
  2. C++ を使用しているので、C スタイルの文字列の代わりに STL の文字列型を使用してください。これらには比較機能が組み込まれています。
  3. playerNamesには 30 個の要素がsortedありますが、29 個の要素があります。なぜ違いがあるのですか?
  4. sorted関数スコープの有効期間があります。一度sort返されたポインタsortedは無効であり、データは後続の関数呼び出しまたはスタック割り当てによって上書きされる可能性があります。
  5. あなたのコードは実際にはソートを実行しません。リストを2回反復するだけで、私には無意味な比較になります。
于 2015-04-29T23:57:11.677 に答える