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

如何创建(并使用)指向C中字符串数组的指针数组?,c,arrays,string,pointers,C,Arrays,String,Pointers,我需要创建一个指针数组,每个指针指向一个字符串数组。 基数是一个大小为2的字符串数组(字符串的长度在开始时未知)。例如,由2个字符串(名字和姓氏)组成的数组: 现在我需要创建一个未知大小的数组(由用户输入),该数组将指向我刚才创建的类型。 我的想法是这样创建: char **people=name; 然后询问用户希望输入多少个名称,并分配足够的空间来容纳所有名称 people=(char**)malloc(sizeof(char*)*num); //num is the number rece

我需要创建一个指针数组,每个指针指向一个字符串数组。 基数是一个大小为2的字符串数组(字符串的长度在开始时未知)。例如,由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 :(
} 

for(i=0;iNot您的方法是错误的,但是您是否考虑过使用包含名字和姓氏的结构,然后根据用户将输入的名称数进行malloc'ing:

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

person* people = malloc(num * sizeof(*person));
这只是简化了指针的交互。虽然您这样做是更好地理解指针的一个很好的练习,但它可能不是最容易理解的方法

如果无法使用结构
,则应执行以下操作:

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

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

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

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

这是阵列,但您需要:

将foo声明为指向char的指针的数组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;
}
#包括
#包括
#包括
int main(){
字符*(*foo)[2];
printf(“有多少人?\n”);
int n;scanf(“%d”&n);
foo=malloc(sizeof*foo*n);
对于(int i=0;i
使用
-std=c99编译

请注意,像这样使用
scanf
strcpy
strlen
是不安全的,因为可能存在缓冲区溢出


另外,记得释放你的malloc!

people[i][0]=(char*)malloc(strlen(bufferFirstName)+1)
是错误的。如果
people
char**
那么
people[0]
char*
people[i][0]
字符
而不是指针。另外:不要抛出mallocs返回值。它不是必需的,也可能是危险的,因为它可以隐藏错误。因此
people
应该是
***
类型,而不是
***/code>(
char***people
)?另外,有没有一种方法可以在一行中定义
people
,而不使用
*名称[2]从这个问题不清楚你的意图是什么。我只是指出了明显的错误。在大多数情况下:当你开始思考<代码> ***>代码>时,你应该考虑使用结构(如在@ MnIDES(S)回答中)。我不允许使用
***
。顺便说一句:否决票是我无意中投的,一定是一个点击。愚蠢的CMS不允许我纠正它。但是。不用担心,我想一定是有人搞错了,因为在我发布它的时候,它几乎立刻就被否决了。行
人[I][0]=malloc(MAX\u NAME\u SIZE*sizeof(char));
显示错误“错误:无法将值类型“char*”分配给“char*”类型的实体。呜呜,是的,我在那里犯了一个错误,但现在已经修复了。@Marco有一个很好的解决方案。当我试图使用它时,它显示了一个错误“错误:不允许使用不完整的类型”。这是在我尝试使用
char*(*foo[])[2];
(在你编辑这篇文章之前)。对不起,第一件事是你问题的实际答案(这就是你问的:P)。这篇文章的其余部分是我认为你想要的。非常感谢。在经历了数小时的挫折之后,我终于有了一些进展。
first name: people[i*2 + 0] 
last name: people[i*2 + 1]
char *(*foo[])[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;
}