[英]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;
}
第一个for
循环不会检查temp
数组是否存在(如何以某种方式不询问内存管理器而检查已分配内存的存在?!)。 temp
仅仅是一个指针。 您要检查的是orig
字符串的第一个start
字节内没有零。 没关系,也许就是您所说的“存在”。
您的意图是从orig
复制到final
,但是将final
重设到orig
。 那就是你的错误所在。 您必须删除该行,它才能解决问题。
您不需要创建temp
指针,可以使用orig
指针。 您可以随意修改它-记住,函数参数实际上是局部变量。 C语言中的函数参数是按值传递,您可以通过将指针(值!)传递给数据来实现按引用传递。
我应该补充一点,这个功能的前提有些破损。 它“有效”,但是这不是人们可能期望的。 值得注意的是:
没有迹象表明源字符串比start
短。
没有迹象表明源字符串比start + count
短。
也许这些还可以,但是在那些情况可能是错误的情况下,该功能的用户应该有可能对此进行指示。 呼叫者会知道预期的是什么,而不是预期的,因此, 仅当您向呼叫者提供一些反馈时,呼叫者才能确定。
您要返回的位置是输出末尾的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? */
}
您编写的内容存在几个问题。 让我们列举一下:
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. */
}
问题在于以下行:
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.