2011-08-05 108 views
0

我需要一些幫助解析一行文本。正在分析的文本行是用戶輸入。需要幫助解析字符串

我想解析一些有管道的東西。

例如:hello world |一個兩個

我可以在管道前進入ArgList。但無法弄清楚如何將 後面的文字變成ArgList2。管道symobol不需要存儲在任何地方。

基本上,我如何得到以下內容?

ArgList[0] = hello 
ArgList[1] = world 

ArgList2[0] = one 
ArgList2[1] = two 

int main(void) 
{ 

char *ArgList[MAX_ARG_LENGTH]; 
char *ArgList2[MAX_ARG_LENGTH]; 

char buf[MAX_BUF_LENGTH]; 

int i = 0 


printf("> "); 

if(!fgets(str, MAX_BUF_LENGTH, stdin)) 
perror("fgets error"); 

ArgList[i] = strtok(bufstr, " \n"); 

while(ArgList[i] != NULL) 
{ 
    printf("%s", ArgList[i]); 

    i++; 
    ArgList[i] = strtok(NULL, " \n"); 
} 

return 0; 
} 

任何建議,將不勝感激。我應該首先將整個用戶輸入字符串標記爲ArgList,然後將管道符號後的所有內容移動到ArgList2中?

什麼是最好的方式去做這件事?

+1

當你運行這段代碼時會發生什麼? –

回答

3

我會做這樣的事情:

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

int main(void) 
{ 

char buf[30] = "hello world | one two"; 

char *str = buf; 

char *str1 = strsep(&str, "|"); 
char *str2 = strsep(&str, "\n"); 

printf("\nstr1 = %s and str2 =%s \n", str1, str2); 
return 0; 
} 

注:應該現在搞清楚你想怎麼的事情你的方式。

+0

'strsep' is不是ANSI C的,而且這也不符合OP的要求。 –

+0

@Oli Charlesworth:OP有沒有特別要求ANCI C的東西?我不這麼認爲,我只是給他和想法,你應該看過**注**。 – hari

+0

但同樣,OP沒有指定他是在POSIX系統上...... –

3

嘗試使用scanf()

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

int main() 
{ 
    char args1[NUMBER_OF_RECORDS][MAX_BUF_LENGTH]; 
    char args2[NUMBER_OF_RECORDS][MAX_BUF_LENGTH]; 
    char buf[MAX_BUF_LENGTH]; 
    char buf2[MAX_BUF_LENGTH]; 
    int i = 0; 

    while (scanf("%s | %s", buf1, buf2)) { 
     strcpy(args1[i], buf1); 
     strcpy(args2[i], buf2); 
     i++; 
    } 
    /* Do something with args1 or args2 */ 
    return 0; 

}

不能保證此代碼正確工程100%。另外,scanf()容易出錯,請謹慎使用。

+0

一個例子可能會讓你的回答更有用... –

+0

scanf()很好,但它有一個bug,第一個scanf()調用會很好,但如果用戶在stdin按Enter鍵,scanf() )沒有正確清除緩衝區,第二個變量將是回車符。你可以通過加入一個換行字符來解決它:scanf(「\ n%d」,&a);似乎你不一定需要使用它,但是很高興知道。 – ambagesia