Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符**使用和打印_C_Malloc_Multidimensional Array_Double Pointer - Fatal编程技术网

C 字符**使用和打印

C 字符**使用和打印,c,malloc,multidimensional-array,double-pointer,C,Malloc,Multidimensional Array,Double Pointer,在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语言中,我使用
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
只是指向字符指针的指针,该字符将成为以nul结尾的字符串中的第一个字符

这条思路直接引出了解决方案:如果c是指向字符的指针,这意味着我们必须分配一些内存来实际保存字符串数组

@DB_Monkey作为注释发布的解决方案试图做到这一点,但并不完全正确,因为它意味着像
c[0]=“cat”
这样的代码将“cat”复制到
c[0]
,事实并非如此——赋值应用于指针,而不是字符串。更好的办法是:

int rows = 3;
char **c = calloc (rows,sizeof(char*));
c[0] = "cat";
c[1] = "dog";
c[2] = "mouse";

这也表明不必显示每个字符串的显式nul终止。

您拥有的是指向
字符的指针。这意味着您已经预留了足够的空间来引用可能(必须)是另一个指针的变量。这不允许您在为这些字符保留空间之前在其中保存实际字符

因此,现在需要两步分配内存,以便可以在
c
变量中使用字符或字符串(如果愿意)

您可以使用和执行
for
循环

首先,您需要为字符串向量分配空间(在C中,它只是字符向量,所以,实际上,您将为指向字符向量的指针向量分配空间):

这使得您的c变量指向字符串的
NUMBER\u
,它是一个整数,指向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));
 }
我使用一个函数
strlen
来获得
buff
的大小(buff只是一个字符串)。检查字符串操作函数

所以我希望这能解决你的问题。还有一件事,在每次malloc之后,您应该检查
malloc
是否没有返回
NULL
,这是在进程虚拟内存耗尽时发生的


希望这有帮助。

您的字符**实际上是一个数字,它认为该数字是一个数字的地址,该数字是一个有效字符的n地址

简言之:

// I am a number that has undefined value, but I pretend to point to a character.
char *myCharPointer;
// the statement above will crash(due to accessing illegal memory), or access arbitrary memory.
char myChar = *myCharPointer; 
要使用此指针,必须对其进行初始化

char *myCharPointer = (char *)malloc(10 * sizeof(char));
现在,您可以用处理数组的相同方式使用这个指针,如果需要,也可以使用适当的指针算法

注意malloc并没有将“array”中的所有值都设置为0,默认情况下它们的值是未定义的

为了完成您想做的事情,您必须执行以下操作:

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

显然,您不会像我所展示的那样显式地执行此操作,但这可以在运行时完成,不会有太多问题,只需将用户的字符串存储在缓冲区中,然后将其附加到列表中,希望它不会耗尽空间(有技术可以避免)


希望这会有所帮助。

正确的方法取决于您要在其中输入的数据。您期望的输入和输出是什么?我已经找到了答案,但8小时内无法作为回复发布,因为我是一个新用户:char**c;int行=3;int col=10;c=calloc(行,大小(字符[col]);c[0]=“cat\0”;c[1]=“狗\0”;c[2]=“鼠标\0”//无法更改:printf(“%*s%s”,0,”,*c);而(*++w)printf(“%s”,*c);免费(c);
// 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
str0 = (char *)&9993039;
str1 = (char *)&9993089;