[英]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.