C

时间:2018-11-29 07:23:13

标签: c arrays string pointers

对于我的一项任务,我必须让用户输入一个名称列表,并且在输入名称时,必须按字母顺序对其进行排序。我想知道(1)何时声明最适合使用的字符串数组:

char test[10][10];

char *test[10]; 

和(2)编写插入方法的最佳方法,我知道如何编写插入排序方法,并且在线上有很多示例,但是它们主要处理的只是一维数组,所以我有点迷失了这该怎么做。谢谢!

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
    }
}