保持错误:[警告]分配使指针从整数开始,而无需强制转换-l [i] =字符串[i];和r [j] =字符串[j];
有人可以解释一下原因,并提出一些使代码正常工作而没有任何错误的更改吗? (我刚刚开始学习C语言,我已经习惯了Java,所以我有点在努力使用字符串)
void split_string_at_index(char* string, int index, char* left, char* right) {
int size = sizeof(string);
char* r[MAX_SUBSTRING];
char* l[MAX_SUBSTRING];
int i,j;
for(i = 0; i<index; i++){
l[i] = string[i];
}
for(j = index; j<size;j++){
r[j] = string[j];
}
}
这里的主要问题是思维方式需要转变,因为C和Java是不同的语言,并且它们之间的差异足够大,以至于使您绊倒。除了问题中报告的警告消息以外,还有其他错误。
从某种意义上说,C中没有字符串。C没有字符串类型。相反,它有一个约定,即如何处理char的缓冲区/数组以充当字符串。特别是,使用空终止符来标记“字符串”的结尾或缓冲区的当前使用部分。
因此,C样式字符串是一个数组/缓冲区,其中包含以空字符('\ 0')结尾的一系列字符。您有责任提供足够大的缓冲区来容纳所有字符和null终止符,而不要向其中填充超出限制的字符,并使其终止为null。
希望这可以使char *变量不是字符串,或者就像字符串,尽管在处理C风格的字符串时会使用它。
所以在:
void split_string_at_index(char* string, int index, char* left, char* right) {
int size = sizeof(string);
您的“字符串”不是字符串,它是指向char的指针,并且其大小与它允许您访问的字符串的长度无关。您想要:
int size = strlen(string);
下一个:
char* r[MAX_SUBSTRING];
char* l[MAX_SUBSTRING];
您正在尝试设置char数组以容纳字符串。指针此时尚未进入。您想要:
char r[MAX_SUBSTRING];
char l[MAX_SUBSTRING];
假设MAX_SUBSTRING足够大,可以包含您将尝试填充到其中的所有字符+ 1作为空终止符。您必须包含+ 1。
在下一部分中,空终止符已丢失,因此需要:
int i,j;
for(i = 0; i<index; i++){
l[i] = string[i];
}
l[index] = '\0';
在r的下一部分,缺少空终止符,并且索引已关闭。
for(j = index; j<size;j++){
r[j - index] = string[j];
}
r[size-index] = '\0';
}
现在应该解决字符串问题,但是还有其他问题。首先,从不使用其中两个参数(左和右)。其次,r和l变量是函数的局部变量,在结束时不再存在。这意味着您的功能实际上是无操作的。我假设目的是l和r真正由此函数的调用者定义(不在其内部),并作为左参数和右参数传递给该函数。此外,这些参数将在当前l和r的函数中使用。