c - 如何对C中输出的正确名称排序列表进行排序?

标签 c arrays list sorting

我正在尝试制作一个简单的个人 ID 及其姓名排名列表。该列表按 Id 升序排序。

我输入的输入是:

Enter: Id Name (5 time)
9 Ace
5 Bob
6 Cindy
7 Dean
2 Erik

我期望得到的输出是

Sorted id is...
2        Erik
5        Bob
6        Cindy
7        Dean
9        Ace

我目前得到的结果是

Sorted id is...
2        ABCDErik
5        BCDErik
6        CDErik
7        DErik
9        Erik

下面是我目前使用的代码。这是一个冒泡排序函数:

int sorting(int n, int *array)
{
    int temp;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < (n - i - 1); j++)
        {
            if (array[j] > array[j + 1])
            {
                temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

还有我的主程序:

int main()
{
    int i, j, temp;
    int num = 5;
    int *id = (int *) malloc(sizeof(int) * 5);
    char *name = malloc(sizeof(char) * 10);

    printf("Enter: Id Name (5 time) \n");
    for (i = 0; i < num; i++)
    {
        scanf("%d %s", &id[i], &name[i]);
    }

    sorting(num, id);

    printf("Sorted id is...\n");

    for (i = 0; i < num; i++)
    {
        printf("%d \t %s \n", id[i], &name[i]);
    }

    free(id);
    free(name);
    return 0;
}

有没有办法使正确的名称与其 ID“链接”起来?

最佳答案

您的数据存储方式有误。当您为了在其中存储字符串而分配内存时,您必须根据字符串长度正确计算内存大小。

还有一个char *是指向一个字符串的指针,字符串数组应该变成char * []

#define STRINGCOUNT 20
#define STRINGLEN 100

int maxlen= ... calculated somehow
int stringcnt= ... calculated somehow

char *stringarray[STRINGCOUNT];
for (i=0; i<STRINGCOUNT; i++)
   stringarray[i] = malloc(maxlen);

另一种方法是静态分配数据:

char stringarray[STRINGCOUNT][STRINGLEN]

第三种方法是动态分配所有内容。请注意,对于字符串指针数组和动态分配,每个字符串都可以分配不同的长度。

char **stringarray=calloc(stringcnt,sizeof(char *));
for (i=0; i<stringcnt; i++)
   stringarray[i] = malloc(maxlen);
// or
   stringarray[i] = strdup(somestring);

此外,您还必须记住,C 字符串以 0 字符结尾,因此要存储 Bob,您至少需要 4 个字节。

您目前所做的是分配 10 个字节的缓冲区,并将所有从不同位置开始的字符串放在那里。

关于链接数据,C 语言中的概念称为struct。在您的情况下,定义将是

struct {
   int rank;
   char *name;
} items;

结构也可以静态或动态分配,但你必须知道名称元素是一个指向字符串的指针,如果没有显式初始化它不会指向分配的内存并且不能使用。

关于c - 如何对C中输出的正确名称排序列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21641607/

相关文章:

python cv2数组到numpy

c - 丢弃 C 数组中的重复元素/超出数组边界

Java:从 HashMap<String, List<String>> 中的给定键返回随机值

python - 使用默认回退选项过滤列表值

python - 将列表与列表列表连接起来

c - 在 ubuntu 中绘制图表

c - 正确释放 GtkBuilder 对象

python - 为什么 np.where & np.min 似乎不能正确处理这个数组?

c++ - 处理两个后续的 SIGTERM

c - Netbeans 可执行 Linux C