将char[]添加到char**(字符串添加到字符串列表)
程序应根据输入创建字符串。我们希望将这些字符串添加到一个列表中,该列表作为指针(指向其他char*指针)传递给函数。 代码如下所示:将char[]添加到char**(字符串添加到字符串列表),c,string,pointers,C,String,Pointers,程序应根据输入创建字符串。我们希望将这些字符串添加到一个列表中,该列表作为指针(指向其他char*指针)传递给函数。 代码如下所示: void主管道(void){ //设置角度α(小)和β(大) char**configurations=calloc(0,sizeof(char*)); 整数重数=0; createConfigString(4、4、0、配置、0和多重性); } void createConfigString(int a、int b、int c、字符**配置、int start、i
void主管道(void){
//设置角度α(小)和β(大)
char**configurations=calloc(0,sizeof(char*));
整数重数=0;
createConfigString(4、4、0、配置、0和多重性);
}
void createConfigString(int a、int b、int c、字符**配置、int start、int*多重性){
int x,i;
int strSize=2*(a+b+c);
对于(x=a;x>=(a+(a%2))/2;x--){
//如果启动新行,则为配置添加新条目
如果(开始==0){
配置=realloc(配置,(*多重性+1)*大小(字符*);
配置[*多重性]=calloc(strSize,sizeof(char));
}
对于(i=0;i
但在编译时,它告诉我们它试图将指针转换为行上的int
配置[*multiplity][start]=“a”;
配置[*多重性][start+2*x]=“b,b\n”;
配置[*多重性][start+2*x]=“b,b,”;
当我们写作时
配置[*multiplity][start]=(int)“a”;
它编译时没有任何警告
我们做错了什么?谢谢您不能使用
=
复制字符串,您必须使用一个函数,例如标准的strcpy
函数
因此:
应该是:
strcpy(configurations[*multiplicity][start], "a,");
其他地方也有同样的模式 不能使用
=
复制字符串,必须使用一个函数,例如标准的strcpy
函数
因此:
应该是:
strcpy(configurations[*multiplicity][start], "a,");
其他地方也有同样的模式 既然
配置
是一个字符**
,那么配置[n]
就是一个字符*
,而配置[n][m]
则应该是一个字符
。您正试图将char*
分配给char
,为此,编译器必须将指针转换为整数类型,然后将其截断为char
大小。这通常不是编码器想要的,因此它会生成警告,让您知道您可能做错了什么。将强制类型转换告诉编译器“是的,我真的想这样做,所以不要警告我”。然而,它可能仍然没有做到你所想的那样
此外,这:
char ** configurations = calloc(0, sizeof(char*));
这可能有问题。Linux上的calloc
手册页上有这样一句话:
If nmemb or size is 0, then calloc() returns either NULL, or
a unique pointer value that can later be successfully passed to free().
由于未检查返回值,因此可能会将空指针传递到
createConfigString
。也许您当前的平台实际上返回了一个“可用”值,但它不会是可移植的。如果它确实返回NULL,那么后面的realloc
可能会有问题(虽然在Linux上,它似乎是可以的),您也不会检查…好吧,因为configurations
是char**
,那么configurations[n]
是char*
,而configurations[n][m]
则应为字符
。您正试图将char*
分配给char
,为此,编译器必须将指针转换为整数类型,然后将其截断为char
大小。这通常不是编码器想要的,因此它会生成警告,让您知道您可能做错了什么。将强制类型转换告诉编译器“是的,我真的想这样做,所以不要警告我”。然而,它可能仍然没有做到你所想的那样
此外,这:
char ** configurations = calloc(0, sizeof(char*));
这可能有问题。Linux上的calloc
手册页上有这样一句话:
If nmemb or size is 0, then calloc() returns either NULL, or
a unique pointer value that can later be successfully passed to free().
由于未检查返回值,因此可能会将空指针传递到
createConfigString
。也许您当前的平台实际上返回了一个“可用”值,但它不会是可移植的。如果它确实返回NULL,那么后面的realloc
可能会有问题(虽然在Linux上,它似乎可以),您也不会检查…我真的是一个C noob,所以这个解释非常有用。谢谢我真的是个笨蛋,所以这个解释很有帮助。谢谢谢谢请注意,strcpy需要一个指针,所以它应该是strcpy(&configurations[*multiplity][start],“str”),这是否意味着当我使用“=”example str“,”example str“将被读取为指针?您希望字符从一个位置“移动”到另一个位置的任何位置。谢谢!请注意,strcpy需要一个指针,所以它应该是strcpy(&configurations[*multiplity][start],“str”),这是否意味着当我使用“=”example str“,”example str“将被读取为指针?只要您希望字符从一个位置“移动”到另一个位置。