c++排序数组.我的分类在第一次传球时有效,但在那之后就不行了

c++ sorting arrays.. My sort works on the first pass but not after that

本文关键字:有效 不行了 之后 数组 排序 我的 分类 第一次 c++      更新时间:2023-10-16

我的第一篇帖子,所以如果我把事情弄得一团糟,请原谅我,并告诉我哪里出了问题,谢谢。

我正在尝试按字母顺序对数组进行排序。它们是一组字符,每个字符组成一个单词。它成功地对第一遍进行了排序,但在第二遍和第三遍之后就不会这样做了。我看不出代码没有改变。记住,第一次传球非常好。感谢

#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
using namespace std;
const int limit = 10;
const int noWords = 4;
typedef char nametype[limit];
#define in_file "data.txt"
#define out_file "result.txt"
void main()
{
int total_count = 0;
int nonarranged = 0;
int rearrange_count = 0;
char temp[20];
char tempchar;
nametype list[noWords];
nametype tempWord;
ifstream ins;
ofstream outs;
ins.open(in_file);
outs.open(out_file);

每个单词最多可包含9个字符,如果少于9个,则多余的字符为空格。我首先运行for循环,将数据文件中的每个字符添加到tempWord中,在9个字符后,我添加空字符"\0",然后将字符串添加到数组列表中。

    while (!ins.eof()) //run until end of file
    {
    for (int i = 0; i < limit - 1; i++)
    {
        ins.get(tempchar);
        tempWord[i] = tempchar;
    }
    tempWord[limit - 1] = '';
    strcpy_s(list[0], tempWord);
    for (int i = 0; i < limit - 1; i++)
    {
        ins.get(tempchar);
        tempWord[i] = tempchar;
    }
    tempWord[limit - 1] = '';
    strcpy_s(list[1], tempWord);
    for (int i = 0; i < limit - 1; i++)
    {
        ins.get(tempchar);
        tempWord[i] = tempchar;
    }
    tempWord[limit - 1] = '';
    strcpy_s(list[2], tempWord);
    for (int i = 0; i < limit - 1; i++)
    {
        ins.get(tempchar);
        if (tempchar != 'n')
            tempWord[i] = tempchar;
    }
    tempWord[limit - 1] = '';
    strcpy_s(list[3], tempWord);

一旦行中的四个单词都在列表中。作为list[0]list[1]list[2]list[3],我开始使用以下代码进行排序。第一次传球有效,但之后不行。

    //rearrange words into alphabetical order
    //pass 1
    if (strcmp(list[0], list[1]) > 0)
    {
        strcpy_s(temp, list[1]);
        strcpy_s(list[1], list[0]);
        strcpy_s(list[0], temp);
        rearrange_count += 1;
    }
    if (strcmp(list[1], list[2]) > 0)
    {
        strcpy_s(temp, list[1]);
        strcpy_s(list[1], list[2]);
        strcpy_s(list[2], temp);
        rearrange_count += 1;
    }
    if (strcmp(list[2], list[3]) > 0)
    {
        strcpy_s(temp, list[2]);
        strcpy_s(list[2], list[3]);
        strcpy_s(list[3], temp);
        rearrange_count += 1;
    }
    //pass 2
    if (strcmp(list[0], list[1]) > 0)
    {
        strcpy_s(temp, list[1]);
        strcpy_s(list[1], list[0]);
        strcpy_s(list[0], temp);
        rearrange_count += 1;
    }
    if (strcmp(list[1], list[2]) > 0)
    {
        strcpy_s(temp, list[1]);
        strcpy_s(list[1], list[2]);
        strcpy_s(list[2], temp);
        rearrange_count += 1;
    }
    //pass 3
    if (strcmp(list[0], list[1]) > 0)
    {
        strcpy_s(temp, list[1]);
        strcpy_s(list[1], list[0]);
        strcpy_s(list[0], temp);
        rearrange_count += 1;
    }
    //to calculate how many sentances did not need to be arranged
    if (rearrange_count = 0)
        nonarranged += 1;
    else
    {
        total_count += rearrange_count;
        rearrange_count = 0;
    }
    for (int i = 0; i < noWords; i++)
        cout << list[i];
    cout << endl;
    }
    cout << "number of sorts " << total_count << endl;
    cout << "amount not arranged " << nonarranged;

    ins.close();
    outs.close();
    _getch();
}

strcpy_s()使用3个参数(至少在Visual Studio中使用)。中间的参数是目标缓冲区的大小。我不知道你为什么没有出错。可以使用strcpy()代替strcpy_s(),也可以添加size参数。

如果需要掉期对账单,则只有5个:

    if (strcmp(list[0], list[2]) > 0)
    {
        strcpy_s(temp, limit, list[2]);
        strcpy_s(list[2], limit, list[0]);
        strcpy_s(list[0], limit, temp);
        rearrange_count += 1;
    }
    if (strcmp(list[1], list[3]) > 0)
    {
        strcpy_s(temp, limit, list[1]);
        strcpy_s(list[1], limit, list[3]);
        strcpy_s(list[3], limit, temp);
        rearrange_count += 1;
    }
    if (strcmp(list[0], list[1]) > 0)
    {
        strcpy_s(temp, limit, list[1]);
        strcpy_s(list[1], limit, list[0]);
        strcpy_s(list[0], limit, temp);
        rearrange_count += 1;
    }
    if (strcmp(list[2], list[3]) > 0)
    {
        strcpy_s(temp, limit, list[2]);
        strcpy_s(list[2], limit, list[3]);
        strcpy_s(list[3], limit, temp);
        rearrange_count += 1;
    }
    if (strcmp(list[1], list[2]) > 0)
    {
        strcpy_s(temp, limit, list[1]);
        strcpy_s(list[1], limit, list[2]);
        strcpy_s(list[2], limit, temp);
        rearrange_count += 1;
    }