在 C 语言中,我使用 char **
来存储一系列字符串。
这是我的代码:
char ** c;
//now to fill c with data ????
//cannot change:
printf ("%*s%s", 0, "", *c);
while (*++w)
printf (" %s", *c);
我不知道如何填充c
的数据。什么是正确的方法?我不能更改这3个打印行,因为它们在一个外部函数中。
在 C 语言中,我使用 char **
来存储一系列字符串。
这是我的代码:
char ** c;
//now to fill c with data ????
//cannot change:
printf ("%*s%s", 0, "", *c);
while (*++w)
printf (" %s", *c);
我不知道如何填充c
的数据。什么是正确的方法?我不能更改这3个打印行,因为它们在一个外部函数中。
char **
根本不“持有”一系列字符串。变量c
只是一个指向字符指针的指针,而该字符将成为以空字符结尾的字符串中的第一个字符。c[0] =“cat”
这样的代码会将“cat”复制到c[0]
中,这并不是这样——赋值应用于指针,而不是字符串。更好的方法是:int rows = 3;
char **c = calloc (rows,sizeof(char*));
c[0] = "cat";
c[1] = "dog";
c[2] = "mouse";
// I am a number that has undefined value, but I pretend to point to a character.
char *myCharPointer;
// | The statement below will access arbitrary memory
// | (which will cause a crash if this memory is not allowed to be accessed).
char myChar = *myCharPointer;
char *myCharPointer = (char *)malloc(10 * sizeof(char));
// I can store 10 "strings"
char **myArrayOfStrings = (char **)malloc(10 * sizeof(char *));
char *str0 = "Hello, world0";
char *str1 = "Hello, World1";
char *str2 = "Hello, World2";
char *str3 = "Hello, world3";
char *str4 = "Hello, world4";
char *str5 = "Hello, world5";
char *str6 = "Hello, world6";
char *str7 = "Hello, world7";
char *str8 = "Hello, world8";
char *str9 = "Hello, world9";
myArrayOfStrings[0] = str0;
myArrayOfStrings[1] = str1;
myArrayOfStrings[2] = str2;
myArrayOfStrings[3] = str3;
myArrayOfStrings[4] = str4;
myArrayOfStrings[5] = str5;
myArrayOfStrings[6] = str6;
myArrayOfStrings[7] = str7;
myArrayOfStrings[8] = str8;
myArrayOfStrings[9] = str9;
// the above is the same as
// *(myArrayOfStrings + 9) = str9
您不必要求任何字符串具有相同的长度, 假设 str [0 .. 9] 实际上是存储这些字符串第一个字符在内存中位置的地址的数字,例如
str0 = (char *)&9993039;
str1 = (char *)&9993089;
myArrayOfStrings实际上也是一个数字,它存储了第一个字符串位置的地址,特别地:myArrayOfStrings = (char **)&str0;
很显然,你不会像我展示的那样明确地这样做,但可以在运行时轻松执行此操作,只需将用户的字符串存储到缓冲区中,然后将其附加到列表中,希望它不会用完空间(有避免这种情况的技术)。
希望这能有所帮助。
for
循环来实现这一点。char **c = malloc(NUMBER_OF_STRINGS * sizeof(char*));
/*All the space with MAX_STR= maximum string size*/
for(i=0;i<NUMBER_OF_STRINGS;i++){
c[i] = malloc(MAX_STR * sizeof(char));
}
MAX_STR
大小的字符串,甚至可以通过执行 c [i] [j] 来从字符串中获取实际的char,这会给你第i个字符串的第j个字符。/*Alloc when you have the string*/
while(fgets(buff, BUFFSIZE, stdin) != NULL){ //This is just an example of an input reading from the keyboard
c[i] = malloc(strlen(buff) * sizeof(char));
i++;
}
strlen
来获取buff
(一个字符串)的大小。请查看string.h以获取有关字符串操作函数的信息。malloc
是否返回了NULL
,如果返回NULL
,则表示您已经用尽了进程虚拟内存。