我需要创建一个指针数组,每个指针指向一个字符串数组。 基数是一个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 :(
}
任何人都可以告诉我如何正确使用这种点数? 感谢。
答案 0 :(得分:3)
来自cdecl:
将foo声明为指向char
的指针数组2的指针数组
char *(*foo[])[2];
因此,foo[0]
是指向char *
这是数组,但是为了您的使用,您需要:
将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
请注意,使用scanf
,strcpy
,strlen
是不安全的,因为可能存在缓冲区溢出。
另外,请记得释放你的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]