【发布时间】:2015-01-11 22:16:16
【问题描述】:
当我尝试递增以在单词结构数组中存储另一个单词时,我有一个关于我的程序崩溃的问题。该程序会正确读取每一行和单词,但是由于某种原因,当我尝试递增以存储更多单词时,它总是会崩溃。有什么建议吗?
文本文件(输入):
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
}
【问题讨论】:
-
表达式
sizeof(input)不会像你期望的那样工作,因为数组衰减到指针你没有得到你传递给函数的数组的大小,你得到的是指针的大小(在大多数 32 位系统上为4,在大多数 64 位系统上为8)。如果您需要函数知道数组的大小(以字节为单位),则需要将其显式传递给函数。 -
感谢您指出这一点,但这与我的问题无关,因为我此时没有使用该变量
-
memset(lineOfWords, 0x00, sizeof(lineOfWords));并不是必需的。 -
澄清 iharob 想说的是:您已经阅读了整行,无需再次从文件中读取单词,您只需将它们读入字符串,从该字符串中获取单词.
-
如果你得到你所说的段错误,只需添加一个简单的 printf 将打印
numOfWords的值并确保它不会超过200,如果是,你会知道它为什么会崩溃。 编辑:简单地说:添加代码以检查边界并在尝试超出边界时打印错误消息。
标签: c file structure text-files