因此,我应该将排序算法作为CS作业来做。
它应该读取任意数量的单词,每个单词均以'\ n'结尾。读取“。”后,应按字母顺序打印单词。
例如: 输入: 苹果 狗 奥地利 苹果
输出: 苹果 苹果 奥地利 狗
我想将单词存储到一个结构中。我认为,为了处理任意数量的单词,我应该制作结构数组。
到目前为止,我已经尝试创建仅具有一个成员(字符串)的typedef结构,并且我计划从中创建结构数组,然后将每个单词存储到该结构中。
关于单词数量的“随机性”,我想在找出已经写了多少个单词然后将每个单词存储到struct数组的每个元素中之后,在main中设置struct类型。
我的问题是: 1.我不知道如何找出字数。我尝试过的唯一一件事就是制作一个函数,该函数可以计算'\ n'出现的次数,尽管效果不是很好。
关于数据结构,我想出了只有一个字符串成员的struct:
typedef struct{
char string[MAX];
}sort;
然后在主要功能中,我首先读取了一些单词(不是实际的赋值,而只是为了使代码起作用)
并且在获得“ len”之后,我声明了sort类型的变量:
int main(){
/*code, scanf("%d", &len) and stuff*/
sort sort_t[len];
for(i = 0; i < len; i++){
scanf("%s", sort_t[i].string);
}
问题:这样的事情是“合法的”吗,我是否使用一种好的方法?
Q2:开始存储结构之前,如何知道存储的单词数量(对于结构数组)?
答案 0 :(得分:0)
恕我直言,为每个字符串保留相同的最大存储量的想法有点浪费。最好坚持使用动态的NUL终止的字符串,就像通常在C代码中那样。这是C库最支持的。
对于管理未知数量的字符串,您可以选择。可能性1是使用Xavier提到的链表。可能是最优雅的解决方案,但调试起来可能很耗时,最终您必须将其转换为数组才能使用一种常见的排序算法。
可能性2是使用类似于C ++ std :: vector对象的东西。假设分配存储的任务委托给某个“袋子”对象。处理“袋子”的代码在调用Vlad提到的 realloc()函数上具有垄断地位。您的主要函数仅调用 bag_create()和 bag_put(bag,string)。这不太优雅,但可能更容易实现。
由于您将重点放在排序算法上,因此我建议使用方法2。您可以使用下面的代码片段作为起点。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct {
size_t capacity;
size_t usedSlotCount;
char** storage;
} StringBag;
StringBag* bag_create()
{
size_t initialSize = 4; /* start small */
StringBag* myBag = malloc(sizeof(StringBag));
myBag->capacity = initialSize;
myBag->usedSlotCount = 0;
myBag->storage = (char**)malloc(initialSize*sizeof(char*));
return myBag;
}
void bag_put(StringBag* myBag, char* str)
{
if (myBag->capacity == myBag->usedSlotCount) {
/* have to grow storage */
size_t oldCapacity = myBag->capacity;
size_t newCapacity = 2 * oldCapacity;
myBag->storage = realloc(myBag->storage, newCapacity*sizeof(char*));
if (NULL == myBag->storage) {
fprintf(stderr, "Out of memory while reallocating\n");
exit(1);
}
fprintf(stderr, "Growing capacity to %lu\n", (unsigned long)newCapacity);
myBag->capacity = newCapacity;
}
/* save string to new allocated memory, as this */
/* allows the caller to always use the same static storage to house str */
char* str2 = malloc(1+strlen(str));
strcpy(str2, str);
myBag->storage[myBag->usedSlotCount] = str2;
myBag->usedSlotCount++;
}
static char inputLine[4096];
int main()
{
StringBag* myBag = bag_create();
/* read input data */
while(scanf("%s", inputLine) != EOF) {
if (0 == strcmp(".", inputLine))
break;
bag_put(myBag, inputLine);
}
/* TODO: sort myBag->storage and print the sorted array */
}