2016-03-06 81 views
-1

我想用strncpy刪除我的字符串的某個部分,但我在這裏面臨一些問題。使用strncpy刪除部分字符*

這是我的2個字符*。

trimmed有例如「127.0.0.1/8 |垃圾|垃圾2 |」這是一個地址的前綴 。

backportion包含「|垃圾|垃圾2 |」

我想要做的是從修剪中刪除代碼的後部分。到目前爲止,我得到了這個:

char* extractPrefix(char buf[1024]){ 
int count = 0; 
const char *divider = "|"; 
char *c = buf; 
char *trimmed; 
char *backportionl; 
while(*c){ 
    if(strchr(divider,*c)){ 
     count++; 

     if(count == 5){ 
      ++c; 
      trimmed = c; 

      //printf("Statement: %s\n",trimmed); 
     } 
     if(count == 6){ 
      backportionl = c; 
     } 
    } 
    c++; 
} 
strncpy(trimmed,backportionl,sizeof(backportionl)); 
printf("Statement 2: %s\n", trimmed); 

哪個網我一個錯誤的backportionl是一個char *而不是一個字符。

是否有無論如何我可以解決這個問題,或找到一個更好的方法來修剪這個char *來獲得我的目標?

+0

你認爲'sizeof(backportionl)'的價值是什麼? – wildplasser

+0

我想它會讓我回到backportionl的長度,這樣我就可以使用strncpy修剪掉所有的東西。 – Bocky

+0

錯誤。它是'sizeof(char *)',可能是4或8. – wildplasser

回答

2

下面是用於分隔的列表,類似於如何strtok工作的第一次,它被稱爲工作的一種方式:

char *extractPrefix(char *buf, const char *dividers) 
{ 
    size_t div_idx = strcspn(buf, dividers); 
    if (buf[div_idx] != 0) 
     buf[div_idx] = 0; 
    return buf; 
} 

如果你不想原來的緩衝區修改時,您可以使用strndup,假設您的平臺支持該功能(Windows不需要;您需要自己編寫代碼)。不要忘了free當你用它做的是返回指針:

char *extractPrefix(const char *buf, const char *dividers) 
{ 
    size_t div_idx = strcspn(buf, dividers); 
    return strndup(buf, div_idx); 
} 

或者,你可以直接返回(字符數或某個值小於0,如果在字符數前綴將不適合在int):

int pfxlen(const char *buf, const char *dividers) 
{ 
    size_t div_idx = strcspn(buf, dividers); 
    if (div_idx > (size_t)INT_MAX) 
     return -1; 
    return (int)div_idx; 
} 

,並使用它像這樣:

int n; 
const char *example = "127.0.0.1/8|rubbish|rubbish2|"; 

n = pfxlen(example, "|"); 
if (n >= 0) 
    printf("Prefix: %.*s\n", n, example); 
else 
    fprintf(stderr, "prefix too long\n"); 

很明顯,你有多種選擇。這真的取決於你想要使用哪一個。

+0

感謝您的詳細解釋! – Bocky

0

免責聲明:我不確定我是否正確理解您實際想要達到的目標。一些例子可能會有所幫助。


我想刪除我的字符串的某一部分[..]

我不知道你在你的代碼嘗試一下,但是這是很容易用strstr,strlenmemmove實現:

首先,用strstr找到想要刪除的字符串的位置。然後將找到的字符串後面的內容複製到找到的字符串開始的位置。

char cut_out_first(char * input, char const * unwanted) { 
    assert(input); assert(unwanted); 
    char * start = strstr(input, unwanted); 
    if (start == NULL) { 
    return 0; 
    } 
    char * rest = start + strlen(unwanted); 
    memmove(start, rest, strlen(rest) + 1); 
    return 1; 
} 
+0

也許你想'strlen(rest)+ 1'在memmove –

+0

@MM確實,謝謝你,修正了。不知道它是OP想要的,但是。 –

+0

是的,他似乎想刪除結尾,而不是刪除開始 –

0

韋爾普,這是愚蠢的,但我基本上固定我的問題在一行。所以這裏去,

trimmed[strchr(trimmed,'|')-trimmed] = '\0'; 
printf("Statement 2: %s\n", trimmed); 

因此,通過使用從和strchr修剪的char *讓「backportion」的指標,我是切實能解決這個問題。

感謝互聯網,沒有太多。

+2

你可能想檢查一下strchr()沒有返回NULL,如果是的話,你會通過數組索引的負指數,下面的答案說明了這一點 –

+2

'trimmed [strchr(trimmed,'|') - trimmed]'表示與'* strchr(trimmed,'|')' –