2016-09-23 145 views
1

我有一個字符串「abcdefg-this-is-a-test」,我想刪除字符串的前6個字符。這是我想要的:從字符串獲取子串C

char contentSave2[180] = "abcdefg-this-is-a-test"; 
strncpy(contentSave2, contentSave2+8, 4); 

到目前爲止沒有運氣,處理器卡住並重置自己。 任何幫助將被處理。

問題:如何修剪C中的字符串?

////編輯//// 我也試過這樣:

memcpy(contentSave2, &contentSave2[6], 10); 

不行的,同樣的問題。

+0

什麼是'contentSave'?沒有定義 –

+0

對不起,我的壞。我只使用1個字符串數組,請參閱編輯。 – sdd

+0

總結一下:_http://ideone.com/5zXUbn_ –

回答

2

您的第一個代碼片段的問題是,它將中間的四個字符複製到字符串的開頭,然後停止。

不幸的是,你不能展開覆蓋整個字符串,因爲在這種情況下,源和輸出緩衝器將重疊,造成UB:

If the strings overlap, the behavior is undefined.

重疊緩衝區與問題你的第二次嘗試:memcpy不允許重疊緩衝區,所以行爲是未定義的。

如果你需要的是在字符串的開始刪除字符,你並不需要在所有複製:只需將初始字符的地址,並使用它作爲新的字符串:

char *strWithoutPrefix = &contentSave2[8]; 

對於從一個緩衝器字符串複製到另一個使用memcpy

char middle[5]; 
memcpy(middle, &contentSave2[8], 4); 
middle[4] = '\0'; // "this" 

用於複印潛在重疊緩衝器使用memmove

char contentSave2[180] = "abcdefg-this-is-a-test"; 
printf("%s\n", contentSave2); 
memmove(contentSave2, contentSave2+8, strlen(contentSave2)-8+1); 
printf("%s\n", contentSave2); 

Demo.

+0

你能解釋第一段嗎?我實際上沒有看到OPs代碼的問題。 –

+0

@EugeneSh。 'strncpy'經常被錯誤地使用,字符串長度可變。最大的問題就是你必須記住最後以空字符結束結果字符串。 [這是一篇文章,解釋在使用常規字符串時使用'n'函數有什麼問題。](https://randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already/) – dasblinkenlight

+0

但是問題在這個問題上?我沒看到它。 –

2

只要您可以使用指針,因爲這裏contentSave2也指向一個字符數組加上這將是快速而短暫。

char* ptr = contentSave2 + 6; 

ptr[0]將等於contentSave2[6]

0

下段應能正常工作:

#include <stdio.h> 
#include <string.h> 

int main() { 
    char contentSave2[180] = "abcdefg-this-is-a-test"; 
    strncpy(contentSave2, contentSave2+8, 4); 
    printf("%s\n", contentSave2); 
    return 0; 
} 

我建議可以發佈您的代碼的其餘部分,因爲你的問題是在其他地方。正如其他人所指出的那樣,當你使用strncpy時應注意重疊,儘管在這種情況下它應該可以工作。

1

您可以使用memmove函數。

當源和目標內存地址重疊時,它特別使用。

小建議,儘量避免複製到和來自重疊源和目的地。它只是一個臭蟲。

3
int len=strlen(content2save); 
for(i=6;i<len;i++) 
    content2save[i-6]=content2save[i]; 

content2save[i-6]='\0' 

這會刪除前6位字符。基於需求你可以修改你的代碼。如果你想使用內置功能嘗試memmove