警告分配使指针从整数开始,而无需在C中进行强制转换

问题描述 投票:0回答:1

保持错误:[警告]分配使指针从整数开始,而无需强制转换-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 compiler-warnings implicit-cast
1个回答
0
投票

这里的主要问题是思维方式需要转变,因为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的函数中使用。

© www.soinside.com 2019 - 2024. All rights reserved.