如何在C中创建(和使用)指向字符串数组的指针数组?

时间:2013-12-11 20:19:27

标签: c arrays string pointers

我需要创建一个指针数组,每个指针指向一个字符串数组。 基数是一个2号字符串数组(字符串的长度在开始时是未知的)。例如,一个包含2个字符串(名字和姓氏)的数组:

char *name[2];

现在我需要创建一个未知大小的数组(由用户输入),它将指向我刚刚创建的类型。 我的想法是以这种方式创建它:

char **people=name;

然后询问用户他想输入多少名字并分配足够的空间来容纳所有名字。

people=(char**)malloc(sizeof(char*)*num); //num is the number received by the user.

这对我来说太复杂了,我无法弄清楚如何调用每个单独的名字来放入一个字符串。 我构建了一个接收所有名称的循环,但我不知道如何正确存储它们。

for(i=0;i<num;i++){
    printf("Please enter the #%d first and last name:\n",i+1);
    //Receives the first name.
    scanf("%s",&bufferFirstName);
    getchar();
    //Receives the last name (can also include spaces).
    gets(bufferLastName);
    people[i][0]=(char*)malloc(strlen(bufferFirstName)+1);
    people[i][1]=(char*)malloc(strlen(bufferLastName)+1);
    //^^Needless to say that it won't even compile :(
} 

任何人都可以告诉我如何正确使用这种点数? 感谢。

2 个答案:

答案 0 :(得分:3)

来自cdecl

  

将foo声明为指向char

的指针数组2的指针数组
char *(*foo[])[2];

因此,foo[0]是指向char *

的数组2的指针

这是数组,但是为了您的使用,您需要:

  

将foo声明为指向char的指针数组2的指针;

char *(*foo)[2];

现在你可以做到:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char *(*foo)[2];

    printf("How many people?\n");
    int n; scanf("%d", &n);

    foo = malloc(sizeof *foo * n);

    for (int i = 0; i < n; i++) {
        char bufFirstName[1024];
        char bufLastName[1024];

        printf("Please insert the #%d first and last name:\n", i+1);

        scanf("%s %s", bufFirstName, bufLastName); 

        char *firstName = malloc(strlen(bufFirstName) + 1);
        char *lastName = malloc(strlen(bufLastName) + 1);

        strcpy(firstName, bufFirstName);
        strcpy(lastName, bufLastName);

        foo[i][0] = firstName;
        foo[i][1] = lastName;
    }

    for (int i = 0; i < n; i++) {
        printf("Name: %s LastName: %s\n", foo[i][0], foo[i][1]);
    }

    return 0;
}

使用-std=c99

进行编译

请注意,使用scanfstrcpystrlen是不安全的,因为可能存在缓冲区溢出。

另外,请记得释放你的malloc!

答案 1 :(得分:0)

您的方法是错误的,但您是否考虑使用包含名字和姓氏的结构,然后根据用户输入的名称数量进行malloc'ing:

typedef struct {
    char* first;
    char* last;
} person;

person* people = malloc(num * sizeof(*person));

这简化了指针交互。虽然你这样做的方式 是更好地理解指针的一个很好的练习,但它可能不是最容易理解的方法。

如果您无法使用structs,则应该执行以下操作:

char** people;  
people = malloc(2*num*sizeof(char*));  

for (int i = 0; i < 2*num; i++) 
    people[i] = malloc(MAX_NAME_SIZE*sizeof(char));

现在您需要通过以下方式引用i th 人员

first name: people[i*2 + 0] 
last name: people[i*2 + 1]