2015-10-19 66 views
1

我試圖得到字符串thet的/ xxx /之後,必須有正斜槓,其中兩個,然後是我需要提取的字符串。 這裏是我的代碼,但我不知道在哪裏設置空結束,有我在這裏要提取任何/709/之後是usr/datapoint/nviTemp1Tokenize一個C字符串

注意/ 709一道數學題

char str[100] = "/709/usr/datapoint/nviTemp1"; 
char *tmp; 
char token[100]; 

tmp = strchr(str+1, '/'); 
size_t len = (size_t)(tmp-str)+1; 
strncpy(token, str+len, strlen(str+len)); 
strcat(token,"\0"); 

/是可變的,它可以是任何大小,但肯定會有兩個正斜槓。

+1

'的strcat(令牌, 「\ 0」);'會做幾乎沒有。你應該做'token [strlen(str + len)] ='\ 0';'而不是。或者你可以使用'strncpy(token,str + len,sizeof(token));'。 – MikeCAT

回答

1

簡單的改進:

char str[100] = "/709/usr/datapoint/nviTemp1"; 
char *tmp; 
char token[100]; 

tmp = strchr(str+1, '/'); 
if (tmp != NULL) strncpy(token, tmp + 1, sizeof(token)); else token[0] = '\0'; 

tmp"/709"後斜線,所以你要什麼就有什麼之後是。 您不必手動計算長度。

此外,strncpy複製最多(第三個參數)字符,所以它應該是目標緩衝區的長度。

1

如果你肯定知道的字符串`「/ NNN /」開頭,那麼很簡單:

char str[100] = "/709/usr/datapoint/nviTemp1"; 
char token[100]; 
strcpy(token, str+5); // str+5 is the first char after the second slash. 

如果您需要獲得第二個斜槓後一切:

char str[100] = "/709/usr/datapoint/nviTemp1"; 
char token[100]; 
char* slash; 
slash = strchr(str, '/');  // Expect that slash == str 
slash = strchr(slash+1, '/'); // slash is second slash. 
strcpy(token, slash+1);  // slash+1 is the string after the second slash. 
+0

不,它不知道它以/ NNN /開頭,有時候路徑是/ NNNNN/ – andre

+0

我認爲你應該確保'slash'不是'NULL'的安全。 – MikeCAT

+0

@MikeCAT:安全是OP的責任。我正在嘗試提供*清除*和*簡單*答案。 – abelenky

1

您可以使用sscanf -

sscanf(str,"%*[/0-9]%s",token); 
/* '/709/' is read and discarded and remaining string is stored in token */ 

token將包含字符串"usr/datapoint/nviTemp1"

Working example

1

您可以使用一個計數器和一個基本while循環:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    if (argc < 2) return 0; 

    char *s = argv[1]; 
    char slash = '/'; 
    int slash_count = 0; 

    while (slash_count < 2 && *s) 
     if (*s++ == slash) slash_count++; 

    printf("String: %s\n", s); 

    return 0; 
} 

然後,你可以做任何你想用s指針,就像strdup它複製或使用strcatstrcpy,等...

輸出:

$ ./draft /709/usr/datapoint/nviTemp1 
String: usr/datapoint/nviTemp1 
$ ./draft /70905/usr/datapoint/nviTemp1 
String: usr/datapoint/nviTemp1 
相關問題