首页 > 解决方案 > 逐字读取文件

问题描述

我不知道为什么,但我的代码打印了一个 (null)(null)(null).... 我必须从文件 'words.txt' 打印单词列表。另一个问题是: fscanf 忽略空格?

#define WORD_LENGTH 1024
#define SIZE_QUOTE 100

int main(){
  char **quote = malloc(sizeof(char*) * (size_t)SIZE_QUOTE);
  long i;
  for(i = 0; i < SIZE_QUOTE; i++){
    if(!(malloc(sizeof(char) * (size_t)WORD_LENGTH)))
      exit(1);
  }
  i = 0;
  FILE *pf = fopen("words.txt", "r");
  while(!feof(pf) && i < SIZE_QUOTE){
    fscanf(pf, "%s", quote[i]);
    printf("%s", quote[i]);
    i++;
  }
  fclose(pf);
  free(quote);
}

标签: cfilescanf

解决方案


您永远不会分配 to 的返回值,malloc()因此quote[i]他们最终会留下来NULL(如果幸运的话):

  char **quote = malloc(sizeof(char*) * (size_t)SIZE_QUOTE);
  long i;
  for(i = 0; i < SIZE_QUOTE; i++){
    if(!(malloc(sizeof(char) * WORD_LENGTH)))

它应该是这样的:

  char **quote = malloc(sizeof(char*) * (size_t)SIZE_QUOTE);
  for(int i = 0; i < SIZE_QUOTE; i++){
    quote[i] = malloc(sizeof(char) * WORD_LENGTH);
    if(!quote[i])

malloc()如果所有大小都已知,您也可以完全避免静态初始化该数组:

char quote[SIZE_QUOTE][WORD_LENGTH] = {{'\0'}};

此外,您最后也应该-free()个人quote[i]

for(int i = 0; i < SIZE_QUOTE; ++i) free(quote[i]);
free(quote);

其他错误已经通过评论指出,不再赘述。


推荐阅读