【问题标题】:Trying to understand a simple C copy function试图理解一个简单的 C 复制函数
【发布时间】:2014-07-31 06:04:50
【问题描述】:

我试图理解从标准输入复制字符的函数,但我无法理解 while 循环和它后面的代码......
这里的 while 循环是如何工作的? 据我了解,这意味着直到to[] 中的ith 字符不等于from[]ith 字符继续添加i 我正确吗??
如果是,那么两个变量中的第 i 个字符如何相等?
这是一个简短的代码:

void copy(char to[] , char from[])   
{
    int i;
    i = 0 ;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

【问题讨论】:

  • 这是一个字符串副本。它将 from 的第 i 个值分配给 to。然后它检查这个值是否为“NUL”,如果不是(即我们不在字符串的末尾),则增加 i 并继续复制。
  • “这意味着直到第 i 个字符从 to[] 不等于” - === 非常不同!
  • nit-pick:我可能会将此函数更改为 void copy(char *to, const char *from),并且最好 - 尽管这需要你重构现有代码 - int copy (char *to, const char *from, size_t max)。后一个函数避免溢出,并返回被复制的字符数
  • @EliasVanOotegem 如果我在开始时定义 MAXLENGTH = x 会不会变得不必要??
  • @ArchKudo:也许,但这会使您的复制功能相当具体(例如:不可重复使用)

标签: c function while-loop void


【解决方案1】:

while 循环中的条件使用了这样一个事实,即在 C 中,赋值表达式的值是在赋值中分配的值。这意味着while 循环中的条件可以实现为具有副作用,即按元素分配源到目标。总的来说,循环的实际工作是在它的条件下进行的,而循环的主体只是增加了索引i

【讨论】:

    【解决方案2】:

    重写它可能会有所帮助:

    do{
      to[i] = from[i];
      ++i;
    }while (from[i-1] != '\0') // -1 here because we incremented i in the line before and need to check the copied position
    

    你现在明白了吗?

    【讨论】:

    • 所以它正在将字符从 to[] 复制到 from[],对吗??
    • 你从右到左阅读作业。所以它复制,顾名思义,从fromto
    【解决方案3】:

    这就是分配的工作方式。赋值 (a = b) 返回一个值 (b)。你在那里做的是从 [i] 移动到 to[i],并将返回值(在本例中为 from[i])与字符 '\0' 进行比较。

    空字符 (0x00) 终止任何字符串,因此是您正在复制的字符串的终止字符。

    不过,我会小心处理这段代码,因为您不会检查数组的边界,并且如果遇到未正确以 null 终止的字符串,或to[] 字符串太短的地方。

    【讨论】:

      【解决方案4】:

      它首先将 from ith 字符复制到 to ith 位置并检查它是否是字符串的结尾。如果不是,则增加 i(现在将指向下一个字符的位置或索引)并执行此操作,直到其匹配字符串结尾,即 '\0'

      【讨论】:

        【解决方案5】:

        你的代码和

        一样
        void copy(char to[] , char from[])   
        {
            int i;
            i = 0 ;
            while (from[i] != '\0')
              {
                to[i] = from[i];
                ++i;
              }
            to[i] = '\0';
        }
        

        因此,虽然它不在 to 的末尾,但它会继续从 in 复制到。

        【讨论】:

        • 如果\0from 中的第一个字符而不将其复制到to,这将中止。
        猜你喜欢
        • 2016-12-11
        • 2020-08-31
        • 1970-01-01
        • 2014-06-06
        • 2016-02-24
        • 2016-04-10
        • 2012-11-25
        • 2017-08-10
        • 1970-01-01
        相关资源
        最近更新 更多