繁体   English   中英

指针字符串

[英]pointers strings

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

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;
}
  1. 第一个for循环不会检查temp数组是否存在(如何以某种方式不询问内存管理器而检查已分配内存的存在?!)。 temp仅仅是一个指针。 您要检查的是orig字符串的第一个start字节内没有零。 没关系,也许就是您所说的“存在”。

  2. 您的意图是从orig复制到final ,但是将final重设到orig 那就是你的错误所在。 您必须删除该行,它才能解决问题。

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

我应该补充一点,这个功能的前提有些破损。 它“有效”,但是这不是人们可能期望的。 值得注意的是:

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

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

    也许这些还可以,但是在那些情况可能是错误的情况下,该功能的用户应该有可能对此进行指示。 呼叫者会知道预期的是什么,而不是预期的,因此, 仅当您向呼叫者提供一些反馈时,呼叫者才能确定。

  3. 您要返回的位置是输出末尾的1位置,即零终止点之后的位置。 那不是很方便。 如果要使用返回的值连接后继字符串,则必须先减一。

下面是带有合理命名的变量的固定代码。

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? */
}

您编写的内容存在几个问题。 让我们列举一下:

  1. char *temp = (char *)orig; -您正在将const char * (您保证不会修改)分配给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.  */
}

问题在于以下行:

final = temp;

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

char *a="abcdefgh";

我想将字符串“ cde”复制到另一个。

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

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

这是您需要的吗?

更改您的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;
}

您的代码有一些错误:

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;
}

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM