C 按第二个字符串对数组排序

C 按第二个字符串对数组排序,c,C,我有一个文本文件,它的名字后面跟一个数字,这个数字是名称的优先级,现在我正试图按优先级对文本文件进行排序,并编写一个新文件 old name1 1 name2 2 name3 3 name4 1 name5 1 name6 2 name7 1 name8 3 new name 1 1 name4 1 name5 1 name2 2 name6 2 name3 3 name8 3 我已经实现了在一个数组中获取旧文本文件,但我仍然坚持按优先级对该数组进行排序。我不应该再次遍历文件,只想对数组进

我有一个文本文件,它的名字后面跟一个数字,这个数字是名称的优先级,现在我正试图按优先级对文本文件进行排序,并编写一个新文件

old
name1 1
name2 2
name3 3
name4 1
name5 1
name6 2 
name7 1
name8 3

new
name 1 1
name4 1
name5 1
name2 2
name6 2
name3 3
name8 3
我已经实现了在一个数组中获取旧文本文件,但我仍然坚持按优先级对该数组进行排序。我不应该再次遍历文件,只想对数组进行排序,然后将新排序的数组写入新的文本文件。我应该如何进行

代码

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


typedef struct{
    int p;
    char *name;
}names;

int main(void){
    FILE *old= fopen("old.txt", "r");
    FILE *new = fopen("new.txt", "w");

    char n[10];
    int i =0;

    names *name= malloc(sizeof(names));

    for(i; i<count; i++){
        int p;

        char *n= malloc(sizeof(char) * 4); 
        fscanf(old, "%s %i", n, &p); 

        names[i].name= n; 
        names[i].p= p;

    }
    int j=0;

    for(i=0; i < count;i++){

    }

    return 0;
}
#包括
#包括
类型定义结构{
INTP;
字符*名称;
}姓名;
内部主(空){
FILE*old=fopen(“old.txt”,“r”);
文件*new=fopen(“new.txt”,“w”);
charn[10];
int i=0;
名称*名称=malloc(sizeof(名称));
对于(i;i您应该使用标准库函数进行排序

它需要您实现一个比较两个
作业
结构的功能,以便提供排序

这里有一个尝试:

static int compare_jobs(const void *a, const void *b)
{
  const job *ja = a, *jb = b;

  return ja->prio < jb->prio ? -1 : ja->prio > jb->prio;
}
static int compare_作业(const void*a、const void*b)
{
常量作业*ja=a,*jb=b;
返回ja->prioprio-1:ja->prio>jb->prio;
}

您需要正确地调用它(阅读文档!),然后在数组上循环并将内容写入一个新文件。

假设您无法使用
qsort()
,因为您的一个限制条件是编写自己的排序算法,下面是

old
name1 1
name2 2
name3 3
name4 1
name5 1
name6 2 
name7 1
name8 3

new
name 1 1
name4 1
name5 1
name2 2
name6 2
name3 3
name8 3
您需要排序什么?一个
作业
数组

您需要按什么键排序?
job.prio

那么如何排序呢?任何常见的选择、插入或(eek)气泡排序都可以。(不过,如果你选择气泡排序,至少要让它性感一点,然后做鸡尾酒杯排序。)只需比较两个
job.prio
s,它们都是
int
s,因此这并不难,并根据需要交换它们各自
job
结构在数组中的位置

这是一个有效的选择排序算法。你可以在谷歌上找到很多其他算法

void selectionSort (job* jobs, int size) {

    int smallest;
    job temp;

    for (int i = 0; i < size - 1; i++) {
        smallest = i;
        for (int walk = i + 1; walk <= size - 1; walk++) {
            if (jobs[walk].prio < jobs[smallest].prio)
                smallest = walk;
        }  // end inner loop
        temp = jobs[i];
        jobs[i] = jobs[smallest];
        jobs[smallest] = temp;
    }   // end outer loop
    return;
}
void selectionSort(作业*作业,整数大小){
int最小;
工作温度;
对于(int i=0;i对于(int walk=i+1;walk为什么在C中这样做?你做得很好。你已经对它进行了测试,并且你有了解决部分难题的方法。下一步是用文字描述你想如何对数据进行排序。元素一和二排序了吗?是的。元素二和三排序了吗?是的。元素三和排序了吗?否。然后做什么。。。用文字描述下一步要编写的程序。然后将其放入问题中并尝试编写。
fscanf(eerste、%s%f)、name和prio)
,小心,
prio
是一个
int
,您正在扫描一个
float
您似乎只为一个作业分配了空间,但您试图读入8个作业并将其存储在未分配的内存中,如果您将
job
声明为
{int prio;char jobName[8];}
;不必为(非常短的)字符串处理单独的
malloc()
,这将使它更简单、更快。Qsort是libc(stdlib.h)的一部分,您已经在使用malloc,它也是stdlib.h的一部分,因此您不需要额外的库