C文本处理:输出大小错误

我正在写一个需要文本文件的ac程序,并且只复制没有大小写或标点符号,并且长度为4个或更多字符的单词。 我测试了布尔函数int containsPunctuationOrCaps(char * word)和int longerThanThree(char * word),它们都工作。 但是,我的主要功能只打印至少七个字符的单词,并且任何更长的内容都会被截断。

int main() {
  char *currentWord = malloc(36);
  int count = 0;
  char *Words[3000];
  FILE *fin, *fout;

  fin = fopen(INFILE,"r");
  if (fin==NULL) {
    printf("INPUT FILE NOT FOUNDn");
    return 1;
  } 
  while(fgets(currentWord, sizeof(currentWord), fin) != NULL) {
    if(!containsPunctuationOrCaps(currentWord) && longerThanThree(currentWord)) {
    Words[count]=currentWord;
    printf("%sn",currentWord);
    count++;
    }
  }
  fclose(fin);    
}

当我改变char * currentWord = malloc(36); char char currentWord []; 它不会读取任何内容。 我如何完成这项工作?


您将currentWord声明为char * ,它指向动态分配的内存。 sizeof是在编译时计算的,并且计算出currentWord类型所需的大小(以字节为单位) - 在你的情况下,存储内存地址/指针所需的大小,这在系统上显然是8字节。 由于fgets追加了一个终止的字节, fgets调用只能读取7个字符。

你可以替换char *currentWord = malloc(36); (注意:你永远不会free分配的内存) char currentWord[36]; 这应该导致至少35个字符被读取。 但是, fgets总是尝试读取直到行的末尾(或直到缓冲区已满),因此currentWord数组将包含多个单词。

您可以在空格处拆分当前currentWord ,但是这需要在缓冲区末尾添加检查逻辑( currentWord的末尾是单词/行的结尾,还是缓冲区已满并且该单词继续?)。 完成你想要的最简单的方法可能是逐个字符地读取文件(使用getc ,但你应该确保你使用了缓冲I / O,参见setbuf )。 在您阅读每个字符时,检查它是否是单词或非单词字符(或EOF)。 在前一种情况下,您将追加到缓冲区,而在后一种情况下,如果符合条件,则会输出该单词,但首先会附加终止符。 currentWord缓冲区应该是动态分配的(除非你知道一个明确的字长上限),如果当前读取的字长于分配的内存currentWord ,你可能不得不重新分配它。


当你写

char currentWord[];

代替

char *currentWord = malloc(36);

你声明一个0大小的静态字符数组。 当sizeof应用于静态数组的名称时,结果是该数组的字节大小。

例如,在这种情况下:

char currentWord[10]; 

sizeof将返回10 * sizeof(char)。

在你的情况下,数组是空的,因此sizeof(currentWord)将返回0。

链接地址: http://www.djcxy.com/p/72149.html

上一篇: C Text Processing: Output Wrong Size

下一篇: call printf using va