2015-04-29 121 views
-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]; 
    } 
} 
+1

不要投射字符串。 – chris

+1

'if(playerNames [i]!=“ - ”){'will * always * success。 C风格的字符串没有这种方式进行比较;你正在比较两个不同的指针是否相等。你想要的是'strcmp()'或WCHAR变体。 –

+0

另外:'i <30'意味着你最终将访问不存在的'i [29]'(29个元素的数组将具有元素0到28)。 –

回答

1

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

而且其他几个要点:

  1. 不要使用C风格的用C++投射。使用C++铸造操作符(static_cast,dynamic_castreinterpret_cast)。
  2. 在使用C++时,使用STL的字符串类型而不是C风格的字符串,因为它们具有内置的比较功能。
  3. playerNames有30个元素,但sorted有29个元素。为什么有差异?
  4. sorted具有函数范围生存期。一旦sort返回任何指针sorted是无效的,数据可能会被后续的函数调用或堆栈分配覆盖。
  5. 您的代码实际上没有执行任何排序,它只是遍历列表两次,导致我认为是无意义的比较。
+0

我对30个元素数组进行了排序,同时改变了'if(playerNames [i '!“=” - “)'到'if(strcmp(playerNames [i],” - “)!= 0)'。仍然没有工作 – Hx0

+0

'playerNames [i]!=“ - ”'如果该数组中的字符串实际上是C++字符串,而不是C字符串,则可以工作。 – n0rd

+0

@ Hx0老实说,只需将你的字符串加载到一个'std :: vector '中,并在vector上调用'std :: sort',就完成了。 – Dai