-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

这是一个问题:if (playerNames[i] != "-"){永远不会执行true分支,因为您正在执行指针比较,而不是值比较(C++ 不像 Javascript 或 C#)。您正在将 string 的内存地址playerNames与文字 string 的地址进行比较"-"

还有其他几点:

  1. 不要在 C++ 中使用 C 风格的强制转换。使用 C++ 强制转换运算符 ( static_cast,dynamic_castreinterpret_cast根据需要代替)。
  2. 当您使用 C++ 时,请使用 STL 的字符串类型而不是 C 样式的字符串,因为它们具有内置的比较功能。
  3. playerNames有 30 个元素,但sorted有 29 个元素。为什么有区别?
  4. sorted具有函数作用域生命周期。一旦sort返回任何指向sorted无效的指针,数据可能会被后续函数调用或堆栈分配覆盖。
  5. 您的代码实际上并没有执行任何排序,它只是遍历列表两次,在我看来,这是毫无意义的比较。
于 2015-04-29T23:57:11.677 回答