需要帮助解析字符串

问题描述:

我需要一些帮助解析一行文本。正在分析的文本行是用户输入。需要帮助解析字符串

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

例如: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

当你运行这段代码时会发生什么? –

我会做这样的事情:

#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系统上...... –

尝试使用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