c - 在 C 中使用字符串进行升序插入排序时遇到问题

标签 c string strcpy insertion-sort

我在整理 c 中的姓名列表时遇到问题。我有用于对名称进行排序的代码,但是当我将它们打印出来时,它们的顺序仍然与开始时相同,所以有些地方不对劲。所以我需要帮助的函数是 sort_data 函数。我将发布我的所有代码,以便它可以帮助你们帮助我!预先非常感谢,这个功能让我苦恼了一上午。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_STRING_LEN 25

void insert_data(char **strings, const char* filename, int size);
void allocate(char ***strings, int size);
void sort_data(char **strings, int size);

int main(int argc, char* argv[]){

    if(argc != 4){
            printf("Wrong number of args");
    }

    char **pointer;
    int size = atoi(argv[1]);


    allocate(&pointer, size);
    insert_data(pointer, argv[2], size);
    sort_data(pointer,size);
}

void sort_data(char **strings, int size){

    int i, j;
    char temp[MAX_STRING_LEN];

    for( i = 1; i < size; i++){
            strcpy(temp, strings[i]);
            j = i - 1;
            while( j >= 0 && strcmp(strings[i], temp) > 0)
            {
                    strcpy(strings[j+1], strings[j]);
                    j = j - 1;
            }
            strcpy(strings[j+1], temp);

    }

    int z;
    for(z = 0; z < size; z++){
    printf("\n%s", strings[z]);
    }
}

void allocate(char ***strings, int size){

    int i;
    *strings =  malloc(sizeof(**strings) * size);

    for( i = 0; i < size; i++)
    {
    (*strings)[i] = malloc(sizeof(char) * MAX_STRING_LEN);
    }
}

void insert_data(char **strings, const char* filename, int size){

    FILE *input;
    input = fopen(filename, "r");

    int i;
    for (i = 0; i < size; i++){

    fscanf(input,"%24s", strings[i]);

    }

    fclose(input);
}

我正在阅读的列表如下:

  • 马特
  • 苏珊
  • 标记
  • 大卫
  • 亚丁
  • 菲尔
  • 埃里克
  • 约翰
  • 卡登
  • mycah

所以我需要按字母顺序获取此列表,但是当我运行代码并在运行排序函数后打印出此列表时,它们仍然按此顺序排列。再次非常感谢您的帮助。

最佳答案

您在这里传递的“尺寸”是什么?

在 sort_data() 中,您似乎将其用作最大字符串大小:

char temp[size];

以及列表中字符串的数量:

for( i = 1; i < size; i++)

我不知道这是否是您唯一的问题,但它一定会在某个时候困扰您。

预计到达时间:您的 while 循环需要工作。请注意,在每次迭代中,您都将“strings[i]”与“temp”进行比较,并在循环之前将它们设置为彼此相等。内部循环内的任何内容都不会被执行,最后您只需将“temp”复制回“strings”中的同一位置。

花几分钟时间准确地规划出每次运行循环时需要发生的事情。在纸上运行它,并写下数组的内容以及“i”和“j”的值。

关于c - 在 C 中使用字符串进行升序插入排序时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24330444/

相关文章:

c - 如何编辑字符串(在 C 结构中)

python - python 中的字符串索引必须是整数错误,但索引是整数

c - 为什么调用 strcpy() 会导致我的源字符串发生变化?

c - 如果 OpenGL 3+ 请求,glfw3 不会绘制?

c - C语言删除Bin文件中的一条记录

c# - 使用 C# String.Format "{0:p0}"百分号前没有前导空格

c - 在 Unix 上打开优化时,strcpy()/strncpy() 在具有额外空间的结构成员上崩溃?

c - C 中的 strcpy 段错误

c - C语言中如何从指针返回值

c++ - 在 C 函数中创建的对象的存在