最终目标是输出一个文本文件,其中重复的单词被编码为一位数字。我当前遇到的问题是读取单词并将其存储到数组中。
#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");
}
我得到的是细分错误错误,或者什么也没有。我想要的是单词是一个字符串数组。我正在为每个字符串分配内存,那么我哪里出错了?
答案 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
的后续调用:该函数从上次调用时离开的位置继续。 ...