2017-06-02 102 views
-1

我看到我的一個朋友將一個字符串拆分並複製到另一個字符串中。這是在C中分割字符串的最好方法嗎?

char str[] = "05/09/2013"; 
char day[3]; 
char month[3]; 
char year[5]; 

memset(day, 0, sizeof(day)); 
memset(month, 0, sizeof(month)); 
memset(year, 0, sizeof(year)); 

month[0] = str[0]; 
month[1] = str[1]; 
day[0] = str[2]; 
day[1] = str[3]; 
year[0] = str[4]; 
year[1] = str[5]; 
year[2] = str[6]; 
year[3] = str[7]; 

month[2] = '\0'; 
day[2] = '\0'; 
year[4] = '\0'; 

我聽說strtokstrsep,但什麼是錯複製上面的方法是什麼?如果我繼續使用上述方法,我將面臨什麼問題?

+1

您是否聽說過[strtok](http://man7.org/linux/man-pages/man3/strtok.3.html) –

+1

一方面,您不檢查它是否實際上是有效日期。忽略這一點,memsets是浪費時間。 –

+0

我沒有問過日期的有效性,反正我已經有了驗證功能。在評論之前閱讀我的問題。 @LucasHolt –

回答

0

char *strsep(char **stringp, const char *delim)將字符串從開頭拆分爲delim的第一個匹配項。返回剪切的字符串,但傳遞時會修改stringp。

3

首先,這是一個破碎的方法,因爲這個小示例演示:

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

int main(void) 
{ 
    char str[] = "05/09/2013"; 
    char day[3]; 
    char month[3]; 
    char year[5]; 

    memset(day, 0, sizeof(day)); 
    memset(month, 0, sizeof(month)); 
    memset(year, 0, sizeof(year)); 

    month[0] = str[0]; 
    month[1] = str[1]; 
    day[0] = str[2]; 
    day[1] = str[3]; 
    year[0] = str[4]; 
    year[1] = str[5]; 
    year[2] = str[6]; 
    year[3] = str[7]; 

    month[2] = '\0'; 
    day[2] = '\0'; 
    year[4] = '\0'; 

    printf("%s.%s.%s\n", day, month, year); 
    return 0; 
} 

輸出:

$ ./splitdate
/0.05.9/20

哦,對了,你的指數錯了!

所以,你看到你的解決方案的第一個也是最重要的缺點:這很難保持。在性能方面,它可能接近最好的,但真的,性能不是一個問題與這種可笑的小數據集。

如果你不介意修改你的原始字符串,strtok()是你最好的選擇。如果您的要求更復雜,請編寫您自己的解析器。

使用 strtok()

修改後的代碼:

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

int main(void) 
{ 
    char str[] = "05/09/2013"; 
    char *month = strtok(str, "/"); 
    char *day = strtok(0, "/"); 
    char *year = strtok(0, "/"); 

    printf("%s.%s.%s\n", day, month, year); 
    return 0; 
} 

輸出:

$ ./splitdate
2013年5月9日

正如你所看到的,短的,簡潔的,bug-自由。

+0

我等待獲得足夠的聲望回來評論這篇文章,但我看到你刪除了最後關於我最初修復他的代碼幾行幾行。我只想說我的編輯只是爲了擺脫這個錯誤,所以人們可以專注於幫助他解決他的實際問題。你的迴應應該被標記爲正確的解決方案。我同意 - 它的簡潔,簡潔,無bug :)。 –

+0

@KurtKing沒有打算犯罪。你是這個網站的新手,你用最好的意圖編寫了一個問題的代碼!這是一個衆所周知的問題(在問題中修復代碼會使答案失效),所以我只對評論者有點瘋狂:他們有更多的經驗,他們*應該*拒絕嘗試修復代碼的編輯請求。現在你知道了,我想你會很好地審查編輯請求:) –

+0

當然!我很欣賞這些信息,這很有意義。我將在未來記錄這一點。乾杯。 –