C中文件中每行的单词

时间:2013-11-23 01:53:58

标签: c file line word

我想使用此函数计算文件中每行的单词数,@ params line_number是文件包含的行数。

当我尝试解析此文件时:

world hello
hello world
hello hello

world salut

我得到了矢量的这些结果

vector[0] = 2
vector[1] = 2
vector[2] = 2
vector[3] = 1
vector[4] = 2

我的代码出了什么问题?如果一行上没有单词,我怎么能停止获得1而不是0?

int * get_vtor(FILE *file, int line_number)
{ 
  int *vtor = malloc(line_number*sizeof(int)), max, j, k, u;
  char a_file_line[TAILLE_MAX_LINE]; // TAILLE_MAX_LINE is #define earlier to 100
  j = k = u = max = 0;
  rewind(file);

   while((fgets(a_file_line, TAILLE_MAX_LINE ,file)) != NULL)
   { 
    char * current = strtok(a_file_line," "); 
    while(current != NULL)
    {
    u++;
    current = strtok(NULL, " ");
    }

    *(vtor+j) = u;
    u = 0; j++;
    memset(a_file_line, 0 , sizeof(a_file_line));
   }  

   return vtor;
}

4 个答案:

答案 0 :(得分:0)

你确定该行真的是空的并且没有换行符吗?当我在本地测试strtok时,它永远不会返回空字符串。但是,fgets不会从字符串中删除尾部换行符,因此您的代码将其视为“一个单词”。

您可以通过将strtok调用中的分隔符字符串更改为" \n"而不是" "来解决此问题。

次要风格说明:我不知道是谁教这种语法,但是不必要地阅读:

*(vtor+j) = u;

你可以更清楚地写出:

vtor[j] = u;

答案 1 :(得分:0)

首先猜测,因为您正在阅读标准输入 基本上每一行都以“新行”字符结束 更多细节解决方案可以在这里找到: Reading c file line by line using fgetc()

答案 2 :(得分:0)

因为你正在使用'strtok',如果第一次点击中没有令牌,它总是返回整个字符串。所以对于空行你会得到'\ n'。

只需过滤它即可获得正确的结果。

while(current != NULL && *current != '\n')

答案 3 :(得分:0)

在fgets后删除换行符:

while((fgets(a_file_line, 100 ,file)) != NULL)
   {   
    a_file_line[strlen(a_file_line) - 1] = 0;

它将换行计为单词,因为当您拆分非空字符串时,即使没有分隔符,它也总是有一个标记。