【问题标题】:How to access and modify arrays of strings in functions?如何访问和修改函数中的字符串数组?
【发布时间】:2021-07-21 21:29:09
【问题描述】:

我对 C 语言相当陌生,我只是在指针上落下,我一直在做练习,我查看了这个网站和谷歌,但我找不到我要找的东西。 (可能是对术语的缺乏经验)

上下文我必须使用一个特定的原型(评分程序使用的)来传递一个字符串数组但是由于我每个函数限制为 25 行我试图将相同的字符串数组传递给另一个函数无济于事,所以这是我的解决方法:

#include <stdlib.h>

int ft_ultimate_range(int **range, int min, int max)
{
    int *arr;
    int i;
    int j;

    j = 0;
    i = min;
    if (min >= max)
    {
        *range = NULL;
        return (0);
    }
    arr = malloc(sizeof(int) * ((long long int)max - (long long int)min));
    *range = arr;
    if(arr == NULL)
        return (-1);
    while (i < max)
    {
        *range[j] = i;
        i++;
        j++;
    }
    return (j);
}

但是,我在*range[j] = i;/ seg 的 vs 代码上获得了 EXC_BAD_ACCESS (code=1)。在终端执行时出错。

我不明白为什么会这样,因为如果我取出星号,我试图将值分配给传递的数组(不兼容的 int 到从 'int' 分配给 'int *' 的指针转换)。

发生了什么事?

你也可以请我指出一个线程解释如何传递字符串数组(或函数之间的int)?

编辑:问题是否有帮助。 (我只是想了解怎么回事)

  • 创建一个函数 ft_ultimate_range,它分配和分配一个整数数组。

  • 这个 int 数组应该包含 min 和 max 之间的所有值。包含最小值 - 排除最大值。

  • 它的原型应该是这样的:

    int ft_ultimate_range(int **range, int min, int max);

  • 应该返回范围的大小(或 -1 错误)。 *如果 min 的值大于或等于 max 的值,range 将指向 NULL,它应该返回 0

【问题讨论】:

  • *range[j]*(range[j]) 相同,与您真正想要的(*range)[j] 有很大不同。或者只是简单的arr[j]
  • 顺便说一句,代码中的任何地方都没有字符串数组。 ????
  • 我建议暂时忘记“分级程序”。相反,通过阅读一本结构良好的书籍来学习 C,并按照书中出现的顺序进行练习。完成后,如果您愿意,可以尝试在线评分(尽管我一直认为这是浪费时间)

标签: c


【解决方案1】:

正如 cmets 中所指出的,*range[i] 可以读作*(range[i]),遵循operator precedence 的规则。这意味着您正试图进入与调用者提供的地址相邻的内存。

使用(*range)[i],或简单地使用您之前创建的arr 变量,将解决此问题。

while (i < max) {
    arr[j] = i;
    i++;
    j++;
}

话虽如此,您的代码有点复杂。虽然我不完全同意函数行限制的想法,但如果这些是你要学习的约束,你会想尝试将问题分解成最简单的组件和所需的步骤。

我们需要的唯一附加变量是范围的计算length,以及我们正在向其中插入值的index。由于implicit conversions,无需转换我们计算的lengthmin 已经提供了我们的起始值。

size_t range(int **dest, int min, int max) {
    if (min >= max)
        return *dest = NULL, 0;

    size_t length = max - min;

    if (!(*dest = malloc(sizeof **dest * length)))
        return -1;

    for (size_t i = 0; i < length; i++)
        (*dest)[i] = min++;

    return length;
}

注意在这个例子中我使用了size_t

[...] 可以存储理论上可能的任何类型(包括数组)对象的最大大小。

并且是索引所述数组的最合适的类型。但是,您需要将 size_t 的每个实例更改为 int 以匹配您的规范。


在 C 中,string 指的是一系列非零字节,后跟 NUL 终止字节 ('\0')。

字符串示例:

const char *foo = "hello, world";
char bar[] = "Alice";
char baz[] = { 'B', 'o', 'b', '\0' };

您的代码中没有字符串。通过查看main 函数及其第二个参数,可以找到传递字符串数组的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2019-05-28
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多