【问题标题】:Reading from an input file and storing words into an array [duplicate]从输入文件中读取并将单词存储到数组中[重复]
【发布时间】:2019-07-03 01:53:13
【问题描述】:

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

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

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

【问题讨论】:

  • 段错误在哪一行?您是否尝试过找出问题所在?你的输入是什么样的?
  • 尝试使用调试器遍历代码。你会看到它死在哪里。
  • gcc 中是否有内置调试器?我正在从命令行运行。
  • 我输入的是同目录下的一个txt文件,内容如下:三个单词重复三个单词重复三个
  • token = strtok(buffer," "); 可能是NULL,下一行printf("Token %d was %s",i,token); 将崩溃。添加检查 (token != NULL) 或使用 token ? token : "NULL" 处理它

标签: c string io strtok


【解决方案1】:

您对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 的后续调用:该函数从上次调用中离开的位置继续。 ...

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 2012-08-18
    相关资源
    最近更新 更多