什么是 CStringArray 或 CSortStringArray。以及如何按顺序排列这个数组?

Posted

技术标签:

【中文标题】什么是 CStringArray 或 CSortStringArray。以及如何按顺序排列这个数组?【英文标题】:What is CStringArray or CSortStringArray. And how to arrange this array in order? 【发布时间】:2015-04-27 05:38:41 【问题描述】:

如果我只使用CStringArray 而不是CSortStringArray,问题是如何排列第一个数组 sortarray 的排列顺序是从(a 到 m)。但是如果我使用CSortStringArray 仍然是一样的。第二个数组 sortarray1 从 1.txt 到 15.txt 使用CStringArrayCSortStringArray 的顺序总是错误的?

void CtestmfcDlg::OnBnClickedOk()
    
        CSortStringArray sortArray;
        sortArray.Add(CString("a"));
        sortArray.Add(CString("b"));
        sortArray.Add(CString("c"));
        sortArray.Add(CString("d"));
        sortArray.Add(CString("e"));
        sortArray.Add(CString("f"));
        sortArray.Add(CString("g"));
        sortArray.Add(CString("h"));
        sortArray.Add(CString("i"));
        sortArray.Add(CString("j"));
        sortArray.Add(CString("k"));
        sortArray.Add(CString("l"));
        sortArray.Add(CString("m"));

        CSortStringArray sortArray1;

        sortArray1.Add(CString("1.txt"));
        sortArray1.Add(CString("2.txt"));
        sortArray1.Add(CString("3.txt"));
        sortArray1.Add(CString("4.txt"));
        sortArray1.Add(CString("5.txt"));
        sortArray1.Add(CString("6.txt"));
        sortArray1.Add(CString("7.txt"));
        sortArray1.Add(CString("8.txt"));
        sortArray1.Add(CString("9.txt"));
        sortArray1.Add(CString("10.txt"));
        sortArray1.Add(CString("11.txt"));
        sortArray1.Add(CString("12.txt"));
        sortArray1.Add(CString("13.txt"));
        sortArray1.Add(CString("14.txt"));
        sortArray1.Add(CString("15.txt"));



        for (int i = 0; i <= sortArray.GetUpperBound(); i++)
            
                testbox1.AddString(sortArray[i]);
            
            //sortArray.Sort();

            for (int j = 0; j <= sortArray1.GetUpperBound(); j++)
            
                testbox2.AddString(sortArray1[j]);
            

   

【问题讨论】:

你的第二个数组没有错排序。它比较的是字符串,而不是整数。 但是输出不对? 我在您的示例中看不到任何输出。怎么了 ?请提供更多详细信息。 第二个数组输出是 1,10,11,12,13,14,15,2,3,4,5,6,7,8,9 这就是问题所在。 这不是问题。正如我已经说过的,这是正确排序的。请参考我的第一条评论。 10.txt2.txt 相比 == '1' 【参考方案1】:

如果最低系统要求是 Vista 或更高,那么您可以使用CompareStringEx

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include "windows.h"

using namespace std;

int wmain()

    vector<wstring> sa;
    wchar_t temp[50];
    for (int i = 12; i > 0; i--)
    
        wsprintf(temp, L"%d.txt", i);
        sa.push_back(temp);
    

    struct 
        bool operator()(const wstring &a, const wstring &b) 
            return CompareStringEx(0, SORT_DIGITSASNUMBERS,
                a.c_str(), a.length(), b.c_str(), b.length(), 0, 0, 0) == CSTR_LESS_THAN;
        
     mysort;
    sort(sa.begin(), sa.end(), mysort);

    for (size_t i = 0, count = sa.size(); i < count; i++)
        wcout << sa[i] << endl;

    return 0;

输出:

1.txt
2.txt
3.txt
...
9.txt
10.txt
11.txt
12.txt

【讨论】:

【参考方案2】:

您不能期望字符串排序算法对整数进行排序。

文件名10.txt 将返回位置[0],而2.txt 则更小(参见ascii 代码49

如果要按整数而不是字符串排序,则必须实现自己的排序算法。

//要删除文件的最后一个扩展名,你可以使用这个:

std::string RemoveLastExtension(const std::string &fileName)

    auto pos = fileName.rfind(".");
    if (pos == std::string::npos)
        pos = -1;
    return std::string(fileName.begin(), fileName.begin() + pos);

【讨论】:

以上是关于什么是 CStringArray 或 CSortStringArray。以及如何按顺序排列这个数组?的主要内容,如果未能解决你的问题,请参考以下文章

CStringArray

使用 CStringArray 调用本机 Dll

将字符串方程转换为 CStringarray - MFC

C26451 算术溢出访问 CStringArray 中的项目

在调试器上一一显示 CStringArray 中的元素?

在 CStringArray 的 5 个元素中选择 3 个元素?