在C中的单词结构数组中存储元素
Storing elements in structure array of words in C
我有一个问题,当我尝试递增以在单词结构数组中存储另一个单词时,我的程序崩溃了。该程序读取每一行和单词都是正确的,但由于某种原因,当我尝试增加以存储更多单词时,它总是崩溃。有什么建议吗?
文本文件(输入):
OK UH UH SOUND FIELD IS UP
OK RUNNING TEST SERIES
OK
SOUTHWEST SOUTHWEST CONFIRMED
PEEN HIT CONFIRMED ARMED FIRE
AND THAT'S TWO UM WHAT YOU WANT TO MOVE A LITTLE CLOSER
OK
OK
PEEN FORE CONFIRMED ARMED
ARMED FIRE
THAT'S A THREE ARMED FIRE
OH THAT'S ONLY A TWO OK
GOING TO LASER CANNON
BOX THAN OK I'M GOING TO GO FOR BAD CHOP CAN YOU CONFIRM BAD CHOP
FIRE
UH HOLD ON ARMED FIRE
OK
GO NEED ARMED FIRE
THAT WAS A REPEAT HE'S MOVING OUT
YEP YOU WANT TO GO AHEAD OF HIM
OK
YOU WANT TO DO A SWEEP
SUE BID ARMED
FIRE
OK
DEED NEED I'M GOING TO OK I'M GOING TO GO FOR SUE ZOO ARMED
FIRE
OK I'M GOING TO GO FOR DEED YEN
DEED YEN DEED YEN
FIRE
OK I NEED A SWEEP
结构代码:
typedef struct {
char word[maxLetters];
int freq;
} WordArray; //struct type
主要代码:
#define maxLetters 101
#define maxWords 200
int inputReader(WordArray input[], char f[maxWords]){
// ATTRIBUTES //
int i = 0;
int uniqueWords = 0;
int contains = 0;
int numOfWords = 0;
int k = 0;
FILE *finput;
char lineOfWords[1000];
finput = fopen( f, "r");
WordArray allWords[maxWords];
while(fgets(lineOfWords, maxWords, finput) != NULL) { // reads each line of words
// PROBLEM IS HERE
while(fscanf(finput, "%s", allWords[numOfWords].word) == 1) // reads each word from line
{
printf("%s\n", allWords[numOfWords].word);// this works
//numOfWords++; if i add this i receive the error
// "Segmentation Error(core dumped)"
}
}
return 0; // default ignore this
}
你的程序崩溃了,因为你没有限制读取的字数,你应该添加到外循环,
(numOfWords < maxWords)
以及我在源代码中添加注释的其他一些问题,我还修复了使用 strtok
解析部分的文件的双重读取。
int inputReader(WordArray input[], char f[maxWords])
{
(void) input;
// ATTRIBUTES //
int numOfWords = 0;
FILE *finput;
char lineOfWords[1000];
finput = fopen( f, "r");
WordArray allWords[maxWords];
/*
* tell fgets NOT to read more than sizeof(lineOfWords) bytes,
* not maxWords, they are unrelated
*/
while ((fgets(lineOfWords, sizeof(lineOfWords), finput) != NULL) && (numOfWords < maxWords)) { // reads each line of words
char *pointer;
char *token;
pointer = lineOfWords;
/* also prevent overflowing the struct array */
while (((token = strtok(pointer, " ")) != NULL) && (numOfWords < maxWords)) {
/* next call to strtok for the same string requires first parameter to be NULL */
pointer = NULL;
/* strncpy prevent copying more than maxLetters bytes */
strncpy(allWords[numOfWords].word, token, maxLetters - 1);
/* ensure null terminating byte */
allWords[numOfWords].word[maxLetters - 1] = '[=11=]';
numOfWords++;
}
}
/* don't forget to close the file */
fclose(finput);
return 0; // default ignore this
}
我有一个问题,当我尝试递增以在单词结构数组中存储另一个单词时,我的程序崩溃了。该程序读取每一行和单词都是正确的,但由于某种原因,当我尝试增加以存储更多单词时,它总是崩溃。有什么建议吗?
文本文件(输入):
OK UH UH SOUND FIELD IS UP
OK RUNNING TEST SERIES
OK
SOUTHWEST SOUTHWEST CONFIRMED
PEEN HIT CONFIRMED ARMED FIRE
AND THAT'S TWO UM WHAT YOU WANT TO MOVE A LITTLE CLOSER
OK
OK
PEEN FORE CONFIRMED ARMED
ARMED FIRE
THAT'S A THREE ARMED FIRE
OH THAT'S ONLY A TWO OK
GOING TO LASER CANNON
BOX THAN OK I'M GOING TO GO FOR BAD CHOP CAN YOU CONFIRM BAD CHOP
FIRE
UH HOLD ON ARMED FIRE
OK
GO NEED ARMED FIRE
THAT WAS A REPEAT HE'S MOVING OUT
YEP YOU WANT TO GO AHEAD OF HIM
OK
YOU WANT TO DO A SWEEP
SUE BID ARMED
FIRE
OK
DEED NEED I'M GOING TO OK I'M GOING TO GO FOR SUE ZOO ARMED
FIRE
OK I'M GOING TO GO FOR DEED YEN
DEED YEN DEED YEN
FIRE
OK I NEED A SWEEP
结构代码:
typedef struct {
char word[maxLetters];
int freq;
} WordArray; //struct type
主要代码:
#define maxLetters 101
#define maxWords 200
int inputReader(WordArray input[], char f[maxWords]){
// ATTRIBUTES //
int i = 0;
int uniqueWords = 0;
int contains = 0;
int numOfWords = 0;
int k = 0;
FILE *finput;
char lineOfWords[1000];
finput = fopen( f, "r");
WordArray allWords[maxWords];
while(fgets(lineOfWords, maxWords, finput) != NULL) { // reads each line of words
// PROBLEM IS HERE
while(fscanf(finput, "%s", allWords[numOfWords].word) == 1) // reads each word from line
{
printf("%s\n", allWords[numOfWords].word);// this works
//numOfWords++; if i add this i receive the error
// "Segmentation Error(core dumped)"
}
}
return 0; // default ignore this
}
你的程序崩溃了,因为你没有限制读取的字数,你应该添加到外循环,
(numOfWords < maxWords)
以及我在源代码中添加注释的其他一些问题,我还修复了使用 strtok
解析部分的文件的双重读取。
int inputReader(WordArray input[], char f[maxWords])
{
(void) input;
// ATTRIBUTES //
int numOfWords = 0;
FILE *finput;
char lineOfWords[1000];
finput = fopen( f, "r");
WordArray allWords[maxWords];
/*
* tell fgets NOT to read more than sizeof(lineOfWords) bytes,
* not maxWords, they are unrelated
*/
while ((fgets(lineOfWords, sizeof(lineOfWords), finput) != NULL) && (numOfWords < maxWords)) { // reads each line of words
char *pointer;
char *token;
pointer = lineOfWords;
/* also prevent overflowing the struct array */
while (((token = strtok(pointer, " ")) != NULL) && (numOfWords < maxWords)) {
/* next call to strtok for the same string requires first parameter to be NULL */
pointer = NULL;
/* strncpy prevent copying more than maxLetters bytes */
strncpy(allWords[numOfWords].word, token, maxLetters - 1);
/* ensure null terminating byte */
allWords[numOfWords].word[maxLetters - 1] = '[=11=]';
numOfWords++;
}
}
/* don't forget to close the file */
fclose(finput);
return 0; // default ignore this
}