对于我的一项任务,我必须让用户输入一个名称列表,并且在输入名称时,必须按字母顺序对其进行排序。我想知道(1)何时声明最适合使用的字符串数组:
char test[10][10];
或
char *test[10];
和(2)编写插入方法的最佳方法,我知道如何编写插入排序方法,并且在线上有很多示例,但是它们主要处理的只是一维数组,所以我有点迷失了这该怎么做。谢谢!
答案 0 :(得分:2)
您显示的声明非常不同。第一个是char
的数组,第二个是指向char
的指针的数组(也称为锯齿数组)。
两者都可以像对待字符串数组一样进行类似处理,但是在语义上有很多差异。例如,在第一个字符串中,字符串限制为9个字符(加终止符),而在第二个字符串中,字符串可以为任意长度(可容纳在内存中)。
两个数组衰变的方式也有所不同(当期望使用指针时,使用纯test
时会发生什么)。第一个将衰减到指向char
,即char (*)[10]
数组的指针。第二个将衰减到指向char
的指针,即char **
。
现在有个大问题:您应该使用哪个?好吧,这实际上取决于用例。从一开始就知道大小的固定大小字符串(总大小足够小以适合通常存储局部变量的堆栈)吗?然后,您可以使用第一个。如果您不知道字符串的长度,或者它们之间的差异可能超过几个字符,那么第二个可能是更好的选择。
第二个问题在很大程度上取决于数组的选择。如果有数组数组(第一个声明),则需要使用strcpy
复制字符串。如果选择了指针数组(第二个声明),则只需在周围分配指针即可。
答案 1 :(得分:0)
我不想在这里解决作业,所以我只是简单地向正确的方向推进:
您想要的是一个链表;然后,无论何时用户输入新名称,都可以将新条目直接插入正确的位置。
第一个开始可能像这样:
struct entry { char name[10]; struct entry* next; };
struct entry* root = NULL;
void addname(char* na) {
if (root == NULL) {
root = (struct entry*)malloc(sizeof(struct entry));
sprintf(entry->name, "%s", na);
}else{
// HERE, walk through all entries! Once you reach one, where next is lex. greater then you create a new entry, and link it into that position of the chain
}
}