【问题标题】:Reading file word by word逐字读取文件
【发布时间】:2018-05-03 20:53:39
【问题描述】:

我不知道为什么,但我的代码打印了一个 (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);
}

【问题讨论】:

  • ... 并检查来自fopenfsanf 的返回值。请参阅手册页
  • ...以及来自malloc()的返回值。
  • 除非每个单词都是1023 个字符长——这是一种存储信息的极其低效的记忆方式。当你读一个单词时,你可以很容易地得到它的strlen(),然后分配strlen() + 1 字符来存储每个单词。否则,您不妨只使用100x1024 2D 数组。

标签: c file scanf


【解决方案1】:

您永远不会将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()-ing 个人 quote[i]

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

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

【讨论】:

  • UpV 用于现场,但最好显示正确的代码。
  • @WeatherVane 对,通过一些示例进行了一些扩展。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多