【问题标题】:Parsing words divided by commas or spaces in a text file- Can I overcome the commas with scanf?解析文本文件中用逗号或空格分隔的单词 - 我可以用 scanf 克服逗号吗?
【发布时间】:2012-07-20 06:52:15
【问题描述】:

我有一个包含行的文本文件,每行包含不超过 80 个字符。每行包含(一个或多个单词),以逗号或空格分隔。我需要词典对单词进行排序。我想将 scanf 与字符串的符号“%s”一起使用,但它只考虑空格。所以我想我不能。有什么比逐个字符更聪明地处理单词解析的方法吗?

这是我打算做的事情的草图:

   char**arr;
    arr=calloc(Size, sizeof(char)*80);
    int m=0;

    while (!feof(file)) {

        char c=fgetc(file);
        while (c!='/n') {
             j=0;
            char* current;
            current=calloc(1,sizeof(char)*80);
            while (c!=','&& c!=' ' && c!='/n') {
                current[j]=c;
                j++;
                c=fgetc(c);
            }
            current[j]='\0';
            arr[m]=current;

            free(current);

        }
    }

【问题讨论】:

  • 你知道strtok函数吗?我想你可能会觉得它很有帮助。
  • 我也可以将它与“/n”一起使用吗? pch = strtok (str," , /n ")?
  • '/n' 有问题,不是单个字符而是两个字符。我想你的意思是'\n'
  • 是的 - 但请按照 Joachim 的建议将其更改为反斜杠(假设您想换行)。干杯!
  • 您也有一个问题,即您正在分配内存,然后释放该内存,同时您保存指向该内存的指针。调用free 后,您不应访问该内存。

标签: c parsing char


【解决方案1】:

假设您在合适的变量中有一整行(line,如下),您可以使用类似:

const char *ptr = line;
char token[80];

while(*ptr != '\0' && sscanf(ptr, "%79[^, ]", token) == 1)
{
  ptr += strlen(token);
  while(*ptr == ',' || *ptr == ' ')
    ++ptr;
}

这使用(在我看来,未充分利用)字符组格式%[] 来抓取字符,直到找到逗号或空格,然后跳过已解析的标记以及随后的任何分隔符。

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    相关资源
    最近更新 更多