排序功能不起作用(字符串比较问题)
Sorting function not working (string comparison issue)
我有一个排序功能,它应该将所有从 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];
}
}
这应该return
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];
}
}
这里有一个问题:if (playerNames[i] != "-"){
永远不会执行 true
分支,因为您正在执行指针比较,而不是值比较(C++ 不像 Javascript 或 C#) .您正在将 playerNames
中字符串的内存地址与文字字符串 "-"
.
的地址进行比较
还有其他几点:
- 不要在 C++ 中使用 C 风格的转换。使用 C++ 转换运算符(根据需要改为
static_cast
、dynamic_cast
或 reinterpret_cast
)。
- 当您使用 C++ 时,请使用 STL 的字符串类型而不是 C 风格的字符串,因为它们具有内置的比较功能。
playerNames
有 30 个元素,而 sorted
有 29 个元素。为什么会有差异?
sorted
具有函数作用域生命周期。一旦 sort
returns 任何指向 sorted
的指针都无效,数据可能会被后续函数调用或堆栈分配覆盖。
- 您的代码实际上并未执行任何排序,它只是遍历列表两次,结果在我看来是毫无意义的比较。
我有一个排序功能,它应该将所有从 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];
}
}
这应该return
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];
}
}
这里有一个问题:if (playerNames[i] != "-"){
永远不会执行 true
分支,因为您正在执行指针比较,而不是值比较(C++ 不像 Javascript 或 C#) .您正在将 playerNames
中字符串的内存地址与文字字符串 "-"
.
还有其他几点:
- 不要在 C++ 中使用 C 风格的转换。使用 C++ 转换运算符(根据需要改为
static_cast
、dynamic_cast
或reinterpret_cast
)。 - 当您使用 C++ 时,请使用 STL 的字符串类型而不是 C 风格的字符串,因为它们具有内置的比较功能。
playerNames
有 30 个元素,而sorted
有 29 个元素。为什么会有差异?sorted
具有函数作用域生命周期。一旦sort
returns 任何指向sorted
的指针都无效,数据可能会被后续函数调用或堆栈分配覆盖。- 您的代码实际上并未执行任何排序,它只是遍历列表两次,结果在我看来是毫无意义的比较。