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

3

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

#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");
}

我得到的是分段错误或者没有任何输出。我想要的是把单词变成字符串数组。我为每个字符串分配了内存,那么我错在哪里呢?


在哪一行出现了段错误?你尝试过找出问题出在哪里吗?你的输入是什么样子的? - nicomp
尝试使用调试器逐步执行代码,你会看到它在哪里出错了。 - john elemans
gcc内置了调试器吗?我是从命令行运行的。 - SolidSnackDrive
我的输入是一个txt文件,位于相同的目录中,其内容如下:三个单词重复三个单词重复三个单词。 - SolidSnackDrive
token = strtok(buffer," "); may be NULL, next line printf("Token %d was %s",i,token); will crash. Add check for (token != NULL) or handle it with token ? token : "NULL" - Hedgehog
很好的发现,但是捕获它并没有改变什么。仍然无法在命令行中输出任何内容。 - SolidSnackDrive
1个回答

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的后续调用:函数从上一次调用结束的位置继续执行。...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接