【问题标题】:Warning assignment makes pointer from integer without a cast in C警告赋值使指针从整数而不在 C 中进行强制转换
【发布时间】:2020-03-23 17:09:33
【问题描述】:

不断收到错误消息:[警告] 赋值使指针从整数转换为 - l[i] = 字符串[i]; 和 r[j] = 字符串[j];

有人可以解释原因并提出一些更改,以使代码正常工作而不会出现任何错误吗? (我刚开始学习 C lol,我已经习惯了 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];
    }
}

【问题讨论】:

  • 很好,您已启用警告。试试char* r[MAX_SUBSTRING]; --> char r[MAX_SUBSTRING];。删除*
  • size = sizeof(string) 给代码string 的大小,这是一个char * 指针。我怀疑代码需要知道指针的大小。 pr0jectgamer,那条线的目标是什么?

标签: c compiler-warnings implicit-conversion


【解决方案1】:

这里的主要问题是思维方式的必要转变,因为 C 和 Java 是不同的语言,它们在这里的不同之处足以让你绊倒。除了问题中报告的警告消息之外,还有其他错误。

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

因此,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];

您正在尝试设置 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 所在的函数。

【讨论】:

  • 我必须使用这两个参数。字符左右。我可以说 char r[MAX_SUBSTRING] = 对吗?左边也一样?
  • @pr0jectgamer 您可能需要使用这两个参数,但不要在您发布的代码中使用。在我的回答结束时,我试图建议您考虑将 l 和 r 变量的版本移动到函数的调用者,将指向它们的指针作为调用中的最后两个参数传递,并使用这些指针而不是l 和 r 在函数中。这将使用这些参数并允许调用者使用函数完成的工作而不是丢弃它。
  • @pr0jectgamer 请记住,C 是一种以价值为导向的语言。没有 Java 样式引用类型。我会打电话给 char r[MAX_SUBSTRING] = right;语法错误和类型不匹配。此外,它在佩戴 C 头时尝试做的事情与佩戴 Java 头时看起来非常不同。我认为您可能需要花一些时间阅读一本关于 C 的好书。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2018-08-10
  • 2016-08-20
  • 1970-01-01
相关资源
最近更新 更多