2015-11-04 112 views
0

我想将输入文件(包含带有多行和分隔符的文本文档,即“!,。?”)解析为单词。我的功能“划分功能”是:C将输入文本文件解析为单词

int splitInput(fp) { 

    int i= 0; 
    char line[255]; 
    char *array[5000]; 
    int x; 
    while (fgets(line, sizeof(line), fp) != NULL) {  
     array[i] = strtok(line, ",.!? \n"); 
     printf("Check print - word %i:%s:\n",i, array[i]); 
     i++; 
    } 
    return 0; 
} 
+4

而且?问题是什么?什么是预期的输出?你究竟得到了什么? – LBes

+0

阅读strtok的手册页面:http://www.cplusplus.com/reference/cstring/strtok/ –

+0

@gopi:当你只发送NULL时,strtok应该知道要拆分哪个字符串?您必须首先用指向您想要分割的字符串的指针调用strtok。然后你用NULL重复调用它,以获得更多的令牌。 –

回答

1

这里的校正功能[额外的样式清理对不起]:

int 
splitInput(fp) 
{ 
    int i = 0; 
    char *cp; 
    char *bp; 
    char line[255]; 
    char *array[5000]; 
    int x; 

    while (fgets(line, sizeof(line), fp) != NULL) { 
     bp = line; 
     while (1) { 
      cp = strtok(bp, ",.!? \n"); 
      bp = NULL; 

      if (cp == NULL) 
       break; 
      array[i++] = cp; 

      printf("Check print - word %i:%s:\n",i-1, cp); 
     } 
    } 

    return 0; 
} 

现在,看看手册页strtok了解bp技巧

+0

是的 - 按我想要的方式工作 - 谢谢!!! – gopi

+0

@gopi不客气!我从来没有给过“好吧,你应该检查手册页” - 迂腐/沮丧/无用对于那些已经做出了像你一样诚实努力的人来说,一种教学方式是给出一两个提示:“你需要一个内部循环,并紧密地看待strtok第一个参数”,更好,但是,我认为人们学习更多完整的解决方案[对我来说更简单 - 这个评论花费的时间比代码长:-)]。这就是我学习的方式:阅读别人的代码并问“他们为什么这样做?”。无论如何,开心编程! –

+0

正是。我只是被卡住了,需要一个推动。非常感谢 - 非常感谢! – gopi

0

如果我正确理解你的问题,你想读取每一行,并将每行分成单词并将其添加到数组中。

array[i] = strtok(line, ",.!? \n"); 

这不会工作的原因很明显,因为它只会返回每行的第一个字,并且您从不分配内存。

这可能是你想要的。

char *pch; 
    pch = strtok(line, ",.!? \n"); 
    while(pch != NULL) { 
     array[i++] = strdup(pch); // put the content of pch into array at position i and increment i afterwards. 
     pch = strtok(NULL, ",.!? \n"); // look for remaining words at the same line 
    } 

不要忘了在使用free之后释放数组元素。

+0

很棒 - 完美的作品 - 谢谢! – gopi

+0

@gopi太棒了,不要忘记在'printf'之后删除'i'的增量,因为这将是多余的。 – Linus