警告赋值从整数生成指针,而不在C中强制转换

警告赋值从整数生成指针,而不在C中强制转换,c,compiler-warnings,implicit-conversion,C,Compiler Warnings,Implicit Conversion,继续获取错误:[警告]赋值从整数生成指针,而不强制转换- l[i]=字符串[i]; 和 r[j]=字符串[j] 有人能解释一下为什么,并提出一些修改建议,使代码能够正常工作而不会出现任何错误吗?(我刚开始学习C lol,我已经习惯了java,所以我在使用字符串方面有点困难) void split\u string\u在索引处(char*string,int index,char*left,char*right){ int size=sizeof(字符串); char*r[MAX_子串]; cha

继续获取错误:[警告]赋值从整数生成指针,而不强制转换- l[i]=字符串[i]; 和 r[j]=字符串[j]

有人能解释一下为什么,并提出一些修改建议,使代码能够正常工作而不会出现任何错误吗?(我刚开始学习C lol,我已经习惯了java,所以我在使用字符串方面有点困难)

void split\u string\u在索引处(char*string,int index,char*left,char*right){
int size=sizeof(字符串);
char*r[MAX_子串];
char*l[MAX_子串];
int i,j;

对于(i=0;i来说,这里的主要问题是心态上的必要转变,因为C和Java是不同的语言,它们在这里的差异太大了,这让你感到困惑。除了问题中报告的警告消息之外,还有其他错误

从某种意义上说,C中没有字符串。C没有字符串类型。相反,它有一个如何处理缓冲区/字符数组作为字符串的约定。特别是,空终止符用于标记“字符串”的结尾或缓冲区当前使用的部分

因此,C样式字符串是一个数组/缓冲区,其中包含以空字符('\0')结尾的字符序列。您负责提供足够大的缓冲区,以容纳所有字符和空终止符,永远不要尝试向其中填充过多的字符,并使其以空字符结尾

希望这能清楚地表明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];
下一步:

您正在尝试设置字符数组以容纳字符串。此时指针不会进入其中。您希望:

int size = strlen(string);
char r[MAX_SUBSTRING];
char l[MAX_SUBSTRING];
假设MAX_子字符串足够大,足以包含所有要填充到其中的字符,空终止符为+1。必须包含+1

在下一部分中,空终止符已丢失,因此您需要:

int i,j;

for(i = 0; i<index; i++){
    l[i] = string[i];
}
l[index] = '\0';
inti,j;

对于(i=0;i)您启用了警告。请尝试
char*r[MAX\u SUBSTRING];
-->
char r[MAX\u SUBSTRING];
。删除
*
size=sizeof(字符串)
为代码提供了
字符串的大小,这是一个
字符*
指针。我怀疑代码需要知道指针的大小。pr0jectgamer,该行的目标是什么?我必须使用这两个参数。字符左和右。我可以说字符r[MAX\u SUBSTRING]你可能需要使用这两个参数,但不在你的发布代码中。在我回答的最后,我试图建议你把L和R变量的版本移到调用方(S)。在函数中,将指针作为调用中的最后两个参数传递给它们,并在函数中使用这些指针而不是l和r。这将使用这些参数,并允许调用方使用函数所做的工作,而不是放弃它。@pr0jectgamer请记住,C是一个面向值的语言。没有Java风格的引用类型。我将char r[MAX_SUBSTRING]=right;这是一个语法错误和类型不匹配。此外,戴着C-head时它试图做的事情与戴着Java-head时可能做的事情非常不同。我认为你可能需要花一些时间阅读一本关于C的好书。
    for(j = index; j<size;j++){
        r[j - index] = string[j];
    }
    r[size-index] = '\0';
}