在从文件中的行读取最大单词时重复的标记?

时间:2014-10-02 23:33:15

标签: c file

我需要从文件中读取一行,找到行中最大的单词,读取下一个单词。看起来很简单。我是C的新手,所以我知道我可能会错过一些简单的东西。如果我不包含'\ n'作为分隔符,它将打印文件中的空白行(段落之间的行),如果最大的单词位于行的末尾,则将打印一个新行。如果我确实包含它,则如果后面有一个空行,则会重复该标记,并跳过文件中的最后一行。 这是代码:

#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFFSIZE 81

int main(int numParms, char *parms[])
{
    FILE *file;
    char buffer[BUFFSIZE];
    char *token;
    int lineNum = 0;
    int currSize = 0;


   file = fopen("in.txt" , "r");
   if(file == NULL) 
   {
        perror("Error opening file");
        return(-1);
   }
   fgets(buffer, BUFFSIZE, stdin);
   while(!feof(stdin)) 
   {    
        char bigWord[30];
        char currWord[30];
        int bigSize = 0;

        lineNum++;
        token = strtok(buffer, " \n\t");
        while(token != NULL)
        {               
            strcpy(currWord, token);
            currSize = strlen(currWord);
            if(currSize > bigSize && currSize != bigSize)
            {
                strcpy(bigWord, currWord);
                bigSize = strlen(bigWord);
            }
            token = strtok(NULL, " \n\t");  
        }
    printf("Line %d's word: %s\n", lineNum, bigWord);

    fgets(buffer, BUFFSIZE, stdin);
    }

   fclose(file);

   return(0);
}

1 个答案:

答案 0 :(得分:0)

  1. 未初始化的缓冲区。

    每当fgets()读取仅由' ''\n''\t'组成的行时,printf("... %s\n", ..., bigWord);就会打印出单位化bigWord, simple可能有前一行解析的内容。

  2. OP打开file,但使用stdin。 @BLUEPIXY

  3. 一些改进

    // improved fgets() usage,  catches IO error, unlike before
    while (fgets(buffer, BUFFSIZE, file) != NULL) {
      char bigWord[BUFFSIZE]; // Worst case size
      bigWord[0] = '\0';  // Initialize bigWord
      size_t bigSize = 0;  // type int is OK for small buffers, but size_t is best
    
      lineNum++;
      char *token = strtok(buffer, " \n\t"); // local declaration
      while(token != NULL) {               
        char currWord[BUFFSIZE]; // local declaration
        strcpy(currWord, token);
        size_t currSize = strlen(currWord);  // local declaration
    
        // Drop 2nd part of if() - not needed
        // if(currSize > bigSize && currSize != bigSize) {
        if(currSize > bigSize) {
          strcpy(bigWord, currWord);
          bigSize = strlen(bigWord);  // or just use bigSize = currSize
        }
        token = strtok(NULL, " \n\t");  
      }
      printf("Line %d's word: `%s`\n", lineNum, bigWord);  // added ``
    }
    

    其他可能的简化:
    无需char currWord[BUFFSIZE],只需使用token即可。