【发布时间】:2021-06-03 11:08:48
【问题描述】:
我正在尝试编写一个程序,在该程序中我从文件中读取信息,并将其按用户选择的不同列进行排序。我现在不关心排序,我似乎无法正确存储数据,当我尝试将文件读入这个数组时,我只是从文件中获取最后一组项目。问题是我需要按特定顺序排列信息,以便稍后对它们进行排序。在我的实际代码中,我将使用 146 行和 4 列,并对不同的列进行排序。
我不能为此项目使用动态内存分配。
这是我正在尝试做的一个简单示例,但这不是我的实际代码:
#include <stdio.h>
int main() {
char *array[2][3]; // Array to store the stuff, like a dataframe??
int i;
char name[10]; // Over-writable array to store name
char age[3]; //Over-writable array to store age
char occupation[12]; // Over writable for occupation
for(i=0; i < 2; i++)
{
scanf("%s %s %s", name, age, occupation); // Get name, age, and occupation as input from file
array[i][0] = name; // assign name to row position i, and column position 0
array[i][1] = age; // assign age to row position i, and column position 1
array[i][2] = occupation; // assign age to row position i, and column 2
// i becomes one after this to move to row 1, column assignments
// should stay the same
}
printf("%-20s %-20s %-20s\n", "Name", "Age", "Occupation"); //Print column headers
for(i = 0; i < 2; i++)
{
printf("%-20s %-20s %-20s\n", array[i][0], array[i][1], array[i][2]); //Print corresponding info
}
return 0;
}
假设我运行它,然后手动输入:
Steve 50 Retired
Alex 23 Server
我的输出如下所示:
Name Age Occupation
Alex 23 Server
Alex 23 Server
我需要将信息存储在临时数组中的原因是因为在某些情况下,我只需要某些信息,而可以省略其他信息。例如 - 我可能需要生成一个按姓名排序的文本文件,包括职业,但不包括年龄,在这种情况下,我只需要一个姓名和年龄数组。
无论我做什么,我都只会得到任何给定数据列表的最后一个元素。这可能是一个 200 行和 4 列的数组,我只会从我正在读取的任何文件中获取最后一个条目,并且它们都将仅使用给出的最后一条信息以正确的格式打印。
如果您有任何想法,请告诉我。
我对 C 中的数组的了解可能会让我失望,我很难掌握指针与数组的关系,但我找不到可以帮助我解决这个问题的大型 2D 示例。
【问题讨论】:
-
在分配字符串时使用 strdup()
-
在每次循环迭代中,您都在重用相同的内存缓冲区。更改(例如):
array[i][0] = name;到array[i][0] = strdup(name);。其他领域也是如此。对于更高级的用法 [使用struct与 2D 数组],请参阅我最近的回答:stackoverflow.com/questions/66464177/… -
@tstanisl 老兄,就是这样!如果你有任何解释为什么会这样,请告诉我。它现在完美运行。上帝啊,寻找这个答案已经 3 天了。
-
你的输入是什么样的,输出应该是什么样的?如果您需要对数据进行排序,如果您可以将所有数据读入内存可能会容易得多,但这需要动态分配。尽管我想您可以将文件
mmap()存储到内存中并对其进行就地排序。 (另外,strdup()也是动态分配。) -
@bannedfromquestioning 要了解发生了什么,您应该阅读指针和动态内存分配。
标签: arrays c string sorting multidimensional-array