【问题标题】:Words per line in file in CC中文件中每行的字数
【发布时间】:2013-11-23 01:53:57
【问题描述】:

我想使用这个函数计算文件中每行的字数,@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;
}

【问题讨论】:

  • 计算单词的方法多么复杂……

标签: c file line word


【解决方案1】:

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

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

Minor style note:我不知道谁教这种语法,但它不必要地难以阅读:

*(vtor+j) = u;

你可以更清楚地写成:

vtor[j] = u;

【讨论】:

  • 它实际上有一个空格字符,我应该提到这一点。
  • 这不是空格字符,而是终止换行符。
  • 你可以通过调整你对strtok的调用来修复它。查看最近的编辑。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    因为您使用的是'strtok',所以如果第一次命中没有标记,它总是返回整个字符串。所以对于空行,你会得到 '\n'。

    只需过滤它,您就会得到正确的结果。

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

    【讨论】:

      【解决方案4】:

      删除 fgets 后的换行符:

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

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

      【讨论】:

        猜你喜欢
        • 2012-11-13
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多