c - 在 RAD Studio XE3 中按字母顺序对二维字符数组进行排序

标签 c c++builder

在我尝试提出任何要求之前,我会尽量把事情弄清楚。 所以我目前正在高中学习作为一名程序员。最近我的老师要求我在 RAD Studio XE3 中创建一个 VCL 表单应用程序,有点像 C 程序,但只有表单和东西。

我必须创建矩阵 N*M(最终是二维字符数组)并在其中存储拉丁字符。然后我不得不用插入排序方法对它进行排序。所以到目前为止我所做的是,我定义了数组,我创建了一个 StringGrid1,从中读取这些字符。我将它们存储到二维字符数组中,但对我来说最难的是让它按字母顺序对这些字符进行排序,但我不必将所有内容排序在一起,只需将每一行单独排序,然后使最终更改显示回 StringGrid1(这不是问题所在)。

正如我之前所说,我在使这类事情发挥作用时遇到了一些重大困难。我已经浏览了十亿个例子,在谷歌上搜索了像 solid AGE。如果这些是整数值,那就没什么了,但我什至无法忍受 C 讨厌 String 值。

我的程序:

http://i.stack.imgur.com/Brx9X.jpg

这就是我设法从 StringGrid1 中读取字符并将它们存储到数组 [i][j] 中的方法。 mmax 和 nmax 用于告诉读取多远,因为用户可以自己选择行数和列数。

    for(int i=0; i < mmax; i++)    //Rindas (kolonnas)
    {
        for(int j=0; j < nmax; j++) //Kolonnas (rindas)
            {
                char * temp = (char*)(StringGrid1->Cells[i][j]).c_str();    //Nolasam no Edit lauka char elementu
                array[i][j] = temp[0];       //Piešķiram masīvam šo elementu
                ListBox1->Items->Add(array[i][j]);    //Ierakstam ListBox1 masīva elementu
                Button3->Enabled = False;
                Button6->Enabled = True;

            }
    }
StringGrid1->Options = StringGrid1->Options >> goEditing;  //Neatļauj lietotājam rediģēt StringGrid1 laukus

那么,现在该怎么做了……我该怎么做?我没有线索了。 one sort chars from 2-D 如何让每一行单独排序,例如有 5 行,每一行都被逐一排序。

最佳答案

首先,您没有正确填充数组。这一行:

char * temp = (char*)(StringGrid1->Cells[i][j]).c_str();

获得临时 String来自 Cells 的实例属性,通过其 c_str() 获取指向其内部数据的指针方法,然后释放 String 当它超出范围时,指针悬空,因此它在此行无效:

array[i][j] = temp[0];

您的数组碰巧以正确的字符值结尾,但这只是因为 String的内部数据被引用计数,TStringGrid仍然有对原始 String 的有效引用值,所以 String数据还没有从内存中物理释放,所以你的 temp指针仍然指向仍然存在的原始内存,但这是您不应依赖的实现细节。

改用这个:

String temp = StringGrid1->Cells[i][j];
array[i][j] = temp[1]; // or temp.c_str()[0]

或者这个:

array[i][j] = StringGrid1->Cells[i][j][1]; // or StringGrid1->Cells[i][j].c_str()[0]

现在,话虽如此,实际的排序逻辑相当简单,特别是如果您使用 STL 为您进行实际的排序,例如:

#include <algorithm>

for(int i=0; i < mmax; i++)
{
    std::sort(&(array[i][0]), &(array[i][nmax]));
}

如果您需要对排序进行更多控制,可以使用自定义比较函数:

#include <algorithm>

bool my_compare(char a, char b)
{
    // return true if the first argument is less than the second, otherwise return false.
}

for(int i=0; i < mmax; i++)
{
    std::sort(&(array[i][0]), &(array[i][nmax]), my_compare);
}

关于c - 在 RAD Studio XE3 中按字母顺序对二维字符数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14952444/

相关文章:

c - 未定义的输出(K&R 1.19)

c - 如何迭代生成字母和数字的所有可能组合以与可变长度字符串匹配?

c - GetAppliedGPOList 和 pGuidExtension 值

c++builder - 我可以在 C++Builder 的单元测试中使用 Googlemock 模拟对象吗?

C++ 设置 TDateTime 变量

c - 结构体数组在内存中的布局

c - 尽管轮询文件描述符,但不可靠的 http 客户端

c++ - 将修改后的矩阵中的所有数字相加

c++指示器/加载轮

c++ - std::getline 用于以逗号分隔的表文件,在某些字段周围使用引号