复制到正确的位置,但在达到计数后不会停止。我认为我的代码应该如下工作
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;
}
答案 0 :(得分:3)
第一个for
循环不检查temp
数组是否存在(如何在不以某种方式询问内存管理器的情况下检查是否存在已分配的内存?!)。 temp
仅仅是一个指针。您要检查的是orig
字符串在第一个start
字节内没有零。那没关系,也许'这就是你对“存在”的意思。
您打算从orig
复制到final
,然后将final
重置为orig
。 这就是您的错误所在。您必须删除该行并解决问题。
您不需要创建temp
指针,可以使用orig
指针。你可以自由修改它 - 记住,函数参数在效果局部变量中。 C中的函数参数是按值传递的,您可以通过将指针(值为!)传递给数据来实现传递引用。
我或许应该补充说,这个功能的前提有点破碎。它“有效”,但它不是人们可能合理期望的。值得注意的是:
没有迹象表明源字符串短于start
。
没有迹象表明源字符串短于start + count
。
也许这些都没问题,但是在这些条件可能是错误的情况下,函数的用户应该可以获得它的指示。调用者会知道什么是预期的,什么不是,所以如果只是向调用者提供一些反馈,调用者可以确定。
您将返回超过输出结尾的位置 - 超过零终止。那不是很方便。如果要使用返回的值来连接后续字符串,则必须首先递减一个字符串。
下面是固定代码,带有明确命名的变量。
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 :(得分:1)
你写的内容中有几个问题。我们列举一下:
char *temp = (char *)orig;
- 您正在将const char *
(您保证不会修改)分配给char *
(您违反了该承诺)。错误的事情要做。
final = temp
。不,这不会使原始 final
(来电者持有的副本)发生变化。它什么都没做。它会将<{>> (函数)的final
副本更改为指向temp
所指向的相同位置。
*temp++;
- 如果您不打算使用它,则无需取消引用它。当然,增加它是正确的[见下面KubaOber的评论主题]。
final++ = *temp++;
- 这只是令人困惑的阅读。
*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. */
}
答案 2 :(得分:1)
问题出在以下几行:
final = temp;
删除它,问题应该解决。
答案 3 :(得分:0)
char *a="abcdefgh";
我希望将字符串“cde”复制到另一个字符串中。
我得到的索引是3(你的开始)。char *temp=malloc(3*sizeof(char))
strncpy(temp,a+3,3);
这就是你需要的吗?
答案 4 :(得分: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;
}
答案 5 :(得分:-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;
}
希望得到这个帮助。