【问题标题】:String doesn't "rewind" itself when accessing via pointer通过指针访问时,字符串不会“倒回”自身
【发布时间】:2023-01-25 01:29:12
【问题描述】:
char *ft_between(char *str, size_t from, size_t to)
{
    char *between;

    between = malloc(16);

    while ((from >= 0) && (from < to) && (to < ft_strlen(str)))
    {
        *(between++) = str[from++];
    }
    *between = '\0';
    printf("%s\n", between); // print nothing
    printf("%s\n", between - 16); // print between but never had to do this before...
    return (between);// even on calling function the pointer still at end of string
}

我认为这是因为我在使用 ++ 之间更改了地址,但我通常这样做并且从未有过这种行为......是因为 malloc 吗???

我错过了什么吗? 有一种方法可以“倒回”弦乐吗? 如果我通过柜台来做,即。之间[counter++] = str[from++];它有效,但我想通过指针来做,因为它更快......从我的红色!

在这个例子中 str 是用 ++ 迭代直到最后添加 char 但是当调用函数返回时,printf 将打印所有 str

void    ft_nbr2str(char *str, size_t nbr, char *base, size_t base_len)
{
    if (nbr >= base_len)
    {
        ft_nbr2str(str, (nbr / base_len), base, base_len);
        while (*str != '\0')
            str++;
        *str = base[nbr % base_len];
    }
    else
        *str = base[nbr];
}

【问题讨论】:

  • edit 您的问题,以显示在递增指针后按预期工作的代码示例。到目前为止您展示的代码完全符合我的预期。
  • 你为什么打电话strlen每一次通过循环?就此而言,(to &lt; ft_strlen(str)) 应该是循环不变的,那么为什么它是 while 测试的一部分呢?
  • 如果您要更改between,那么它将不再指向字符串的开头。保存原始值,然后使用它来检查(并返回)结果。
  • 我会不是malloc arg 硬连线为 16。你是怎么得到的?你必须手动运行它才能弄清楚。我会在循环中使用 realloc,这样您就可以进行精确控制,而不必“预测”16 的值。

标签: c substring dynamic-memory-allocation c-strings function-definition


【解决方案1】:

我想是因为我改变了 between using ++ 的地址

那是因为你修改了价值between 通过 ++ 运营商。该值是其他内容的地址。这地址不能修改 between 或任何其他对象。

但我通常这样做并且从未有过这种行为。

你描述的行为是绝对正常的,所以要么不,你通常这样做,或者是的,你确实有这种行为。在您的代码中,您将在 from 上观察到相同的效果。我真的不明白为什么在你执行*between = '后立即

【解决方案2】:

在您递增指针后,它现在指向不同的内存区域。由于指针是char类型,加一个单位和加sizeof(char)个单位一样,结果还是1;要“倒带”它,就像你说的,你只需要减去 16 * sizeof(char) = 16(注意你取消引用指针的总和为 16,所以减去 16 让它回到它的位置,或者减去你想要的次数,以便它指向你期望的位置)

【讨论】:

  • 你怎么知道是16?或者任何长度?为此,我们需要:char *orig = between; 在循环之前 [或某种循环计数器]。然后,在between -= between - orig;之后,但是,更容易做到:在循环之后between = orig;printf("%s",orig);;这里的“倒带”可能更好地表达为“返回/重置为原始状态”。
  • 我简化了代码,因为它不起作用,所以使用 16 只是为了测试目的......所以基本上 vlad 的答案非常酷。我会用它...
  • 谢谢大家!!有经验丰富的编码员的帮助是非常酷的......
【解决方案3】:

在这个声明之后

*between = '
猜你喜欢
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
相关资源
最近更新 更多