从输入文件读取并将单词存储到数组中

时间:2019-02-08 19:16:59

标签: c string io strtok

最终目标是输出一个文本文件,其中重复的单词被编码为一位数字。我当前遇到的问题是读取单词并将其存储到数组中。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_CODE 120
void main() {
    FILE *inputfile = fopen("input.txt","rw");
    char buffer[128];
    char *token;
    char *words[MAX_CODE];
    int i = 0;
    while(fgets(buffer, 128, inputfile)){
        token = strtok(buffer," ");
        printf("Token %d was %s",i,token);
        while(token != NULL) {
            words[i] = malloc(strlen(token)+1);
            strcpy(words[i], token);
            i++;
            token = strtok(buffer," ");
        }
    }
for(int i = 0; i<3; i++) printf("%d\n%s\n",i,words[i]);
printf("End");
}

我得到的是细分错误错误,或者什么也没有。我想要的是单词是一个字符串数组。我正在为每个字符串分配内存,那么我哪里出错了?

1 个答案:

答案 0 :(得分:4)

您对strtok的第二次调用应为第一个参数传递NULL。否则,strtok将一遍又一遍地解析第一个令牌。

    token = strtok(buffer," ");
    printf("Token %d was %s\n",i,token);
    while(i < MAX_CODE && token != NULL) {
        words[i] = malloc(strlen(token)+1);
        strcpy(words[i], token);
        i++;
        token = strtok(NULL," ");
    }

为了安全起见,对MAX_CODE进行检查是为了增大buffer的大小或减小MAX_CODE的值。在您当前的代码中,您可以在128字节缓冲区中容纳的空格分隔令牌的最大数量为64。

来自cppreference

  
      
  • 如果为str != NULL,则该呼叫被视为对此特定字符串对strtok的首次呼叫。 ...
  •   
  • 如果为str == NULL,则该调用被视为对strtok的后续调用:该函数从上次调用时离开的位置继续。 ...
  •