2011-09-07 96 views
0

我想在第一個空格字符處將字符串拆分爲兩部分。例如,我有一個字符串「Hay Guys LOL」,分割時,「Hay」應該在一個變量中,而「Guys LOL」在另一個變量中。如何分割一次字符串?

我已經研究過像strtok這樣的函數 - 它可以工作,但我寧願不循環,然後組合字符串。

這是我現在有(嘗試的sscanf):

char test[32]; 
strcpy(test, "Hay Guys LOL\r\n"); 

// p1 should have "Hay", and p2 have "Guys LOL"? 
char p1[16], p2[16]; 
sscanf(test, "%s %s\r\n", p1, p2); 

printf("p1: %s\n", p1); 
printf("p2: %s\n", p2); 

謝謝!

+2

考慮一下你是否真的想在你的字符串中使用'「\ r \ n」而不是'「\ n」'。 C只使用'「\ n」'來表示一行結尾;它在輸入和輸出到文本流時轉換爲系統特定的行結束(通常爲「\ n」或「\ r \ n」')。這取決於你將要使用的字符串。 –

回答

2

讓它:

sscanf(test, "%s %[^\r\n]", p1, p2); 

第一%s將只讀取第一個字符串高達第一blankspace讀「乾草」。接下來,掃描集將讀取,直到'\r''\n'而不是在字符串中找到(^中的[]顛倒了該集合)。因此%[^\r\n]會將字符串的其餘部分讀入p2

UPDATE

由於@Adam羅森菲爾德說,爲了避免緩衝區溢出,你需要限制由sscanf投入p1p2字符的數字。您指定的字符數爲%10[^\r\n]%10s。由於這些數字需要是格式字符串的一部分,因此您可能希望在使用前動態生成格式字符串。

char format_string[MAX]; 

sprintf (format_string, "%%%ds %%%d[^\\r\\n]", 10, 10); 

sscanf (test, format_string, p1, p2); 

在長度限制的格式字符串上面先做出,然後使用它。請注意轉義字符。 %%用於在輸出中打印單個%,而\\用於在輸出字符串中打印單個\

+0

完美的作品!非常感謝你 – jo1

+1

注意緩衝區溢出!如果'p1'和'p2'每個長度爲16個字節,在這種情況下最好使用格式字符串'「%16s%16 [^ \ r \ n]」'。 –

+0

我想接受答案 - 說我可以在50秒內做到這一點 – jo1