【问题标题】:need help with parsing string在解析字符串方面需要帮助
【发布时间】:2011-08-05 00:25:32
【问题描述】:

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

我正在尝试解析其中有管道的东西。

例如:你好世界 |一二

我可以将管道前的单词放入 ArgList。但是想不通怎么弄 在管道进入 ArgList2 之后获取单词。管道符号不需要存储在任何地方。

基本上,我如何获得以下内容?

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 中吗?

最好的方法是什么?

【问题讨论】:

  • 运行这段代码会发生什么?

标签: c parsing


【解决方案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;
}

注意:您现在应该弄清楚自己想要的东西。

【讨论】:

  • strsep 不是 ANSI C。此外,这也不是 OP 想要的。
  • @Oli Charlesworth:OP 是否要求专门为ANCI C 提供一些东西?我不这么认为。我只是给了他和想法,你应该阅读注意
  • 这是一个完全合理的论点...除非 OP 另有说明,否则您应该假设他们想要一个与平台无关的解决方案。如果 OP 恰好在 Windows 上,那么你的回答是没有用的!
  • 感谢 Hari,这似乎对我有用。您的代码将缓冲区分成两个字符串。然后我分别对这两个字符串进行标记,将 str1 标记为 ArgList,将 str2 标记为 ArgList2。
  • 哦,很抱歉没有说明我的平台是什么。我使用的是 Unix C。我猜 strsep 在 Windows 中是行不通的。
【解决方案2】:

尝试使用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()容易​​出错,请谨慎使用。

【讨论】:

  • scanf() 很好,但是它有一个错误,第一次 scanf() 调用会很好,但是如果用户在标准输入上按了 Enter,scanf() 不会清除缓冲区正确,第二个变量将是回车。您可以通过像这样输入换行符来绕过它: scanf("\n%d",&a);似乎您不一定需要使用它,但很高兴知道。
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 2014-01-10
相关资源
最近更新 更多