0

在正确的位置复制,但在达到计数后不会停止。我认为我的代码应该如下工作

char har *orig, int start, int count, char *final);

int main(void)
{
    const char source[] = "one two three";
    char result[] = "123456789012345678";

    printf("%s\n",GetSubstring(source, 4, 3, result));

    return 0;
}

char r *orig, int start, int count, char *final)
{    
    char *temp = (char *)orig;

    final = temp;


   }

    for ( ; *temp && (count > 0) ; count--)
    {
    rn final;
}
4

6 回答 6

3
  1. 第一个for循环不检查temp数组是否存在(如何在不以某种方式询问内存管理器的情况下检查分配的内存是否存在?!)。temp只是一个指针。您正在检查的是字符串在第一个字节orig内没有零。start没关系,也许'这就是你所说的“存在”。

  2. orig您的意图是从to复制final,但您重置finalorig. 那就是你的错误所在。您必须删除该行,它可以解决问题。

  3. 您不需要创建temp指针,您可以使用orig指针。你可以随意修改它——记住,函数参数实际上是局部变量。C 中的函数参数是按值传递的,您通过将指针(它们是值!)传递给数据来实现按引用传递。

我应该补充一点,这个函数的前提有些被打破了。它“有效”,但这不是人们合理预期的。尤其:

  1. 没有迹象表明源字符串比start.

  2. 没有迹象表明源字符串比start + count.

    也许这些都可以,但在这些条件可能是错误的情况下,函数的用户应该可以得到它的指示。来电者会知道什么是预期的,什么不是,所以只要您向来电者提供一些反馈,来电者就可以确定它。

  3. 您正在返回超过输出末尾的位置 - 超过零终止。那不是很方便。如果要使用返回值连接后续字符串,则必须先将其减一。

下面是固定代码,变量命名合理。

char *GetSub(const char *src, int start, int count, char *dst)
{
    for ( ; *src && (start > 0) ; start--)
    {
        src++; /* Note: *src++ works too, but is pointless */
    }

    for ( ; *src && (count > 0) ; count--)
    {
        *dst++ = *src++;
    }

    *dst++ = 0;
    return dst; /* Notice: This returns a pointer to the end of the
                memory block you just wrote. Is this intentional? */
}
于 2012-07-31T12:43:04.293 回答
1

问题出在以下行:

final = temp;

删除它,问题应该得到解决。

于 2012-07-31T12:44:28.140 回答
1

你写的东西有几个问题。我们列举一下:

  1. char *temp = (char *)orig;- 您将 a const char *(您承诺不修改)分配给 a char *(您违反了该承诺)。做错事了。

  2. final = temp. 不,这根本不会改变原件 final(调用者持有的副本)。它一无所获。它将您的(函数)副本更改为指向指向final的同一位置temp

  3. *temp++;- 如果你不打算使用它,那么取消引用它是没有意义的。当然,增加它是正确的 [参见下面 KubaOber 的评论线程]。

  4. final++ = *temp++;- 这只是令人困惑的阅读。

  5. *final++ = 0; return final;- 您将地址处的值设置final为“0”。然后你增加它(指向空间中的某个地方,可能指向一个黑洞)。然后返回该指针。这也是错误的。

真正应该做的是以strncpy一种方便的方式包装。

但是如果你坚持自己写,你可能希望你的函数像这样简单:

char *GetSub(const char *orig, int start, int count, char *final)
{    
  int i;

  for (i = 0; i < count; i++)
    {
      final[i] = orig[i+start];

      if (final[i] == '\0')
        break;
    }
  final[i] = '\0';

  return final; /* Yes, we just return what we got.  */
}
于 2012-07-31T12:36:05.870 回答
0
char *a="abcdefgh";

我希望将字符串“cde”复制到另一个中。

我得到的索引是 3(你的开始)。

char *temp=malloc(3*sizeof(char))
strncpy(temp,a+3,3);

这是你需要的吗?

于 2012-07-31T12:29:25.293 回答
0

改变你的GetSub功能:

char *GetSub(const char *orig, int start, int count, char *final)
{
    char *temp = (char *)orig;

    // with original final = temp and final++ you loose final valid pointer
    char *final2 = final;


    for ( ; *temp && (start > 0) ; )
    {
        start--;

        // you don't need to dereference temp
        temp++;
    }

    for ( ; *temp && (count > 0) ; count--)
    {
        *final2++ = *temp++;
    }

    *final2 = 0;

    // return a valid pointer
    return final;
}
于 2012-07-31T12:44:35.550 回答
-2

你的代码有一些错误:

char *GetSub(const char *orig, int start, int count, char *final)
{
    char *temp = (char *)orig;

    //final = temp; /* Why this? */

    for ( ; *temp && (start > 0) ; )
    {
        start--;
        temp++; /* Instead of *temp++ */
    }

    for ( ; *temp && (count > 0) ; count--)
    {
        *final++ = *temp++;
    }

    *(final+count) = '\0';
    return final;
}

希望这有帮助。

于 2012-07-31T12:44:05.973 回答