我目前正在使用c编写一个学校程序,但无法从文件中读取文本。我以前只在Java中工作过,所以我还不完全熟悉c,即使我确信它很简单,这也使我彻底陷入了困境。
这是一个如何在我们必须阅读的文件中设置文本格式的示例:
boo22 $ Book5555bOoKiNg#bOo#TeX123tEXT(JOHN)
我必须接受每个单词并将其存储在数据结构中,并且单词仅是字母字符,因此没有数字或特殊字符。我已经使数据结构正常工作,所以我只需要将每个单词放入一个char数组中,然后将其添加到我的结构中即可。它必须继续读取每个字符,直到达到非alpha字符值为止。我尝试研究从文件扫描的不同方法,但不确定哪种方法最适合我的情况。
这是我现在输入的代码:
char str[MAX_WORD_SIZE];
char c;
int index = 0;
while (fscanf(dictionaryInputFile, "%c", c) != EOF) //while not at end of file
{
if (isalpha(c)) //if current character is a letter
{
tolower(c); //ignores case in word
str[index] = c; //add char to string
index++;
}
else if (str[0] != '\0') //If a word
{
str[index] = '\0'; //Make sure no left over characters in String
dictionaryRoot = insertNode(str, dictionaryRoot); //insert word to dictionary
index = 0; //reset index
str[index] = '\0'; //Set first character to null since word has been added
}
}
我的想法是,如果它没有首先击中if语句,那么我必须检查str是否是单词,这就是为什么它检查str的0索引是否为null的原因。我猜我拥有的else if语句虽然不正确,但是我无法找到一种方法来结束正在构建的当前单词,然后在将str添加到我的数据结构中时将其重置为null。现在,当我运行此命令时,如果我将txt文件作为参数传递,则会遇到分段错误。
我只想知道我是否处在正确的轨道上,如果可能的话,也许应该对我应该如何读取这些数据有所帮助。
这是我第一次在这里发布信息,因此希望我提供了您需要帮助的所有内容,即使不仅仅是让我知道,我也乐于添加更多信息。
最大的问题:的使用不正确fscanf()
。@BLUEPIXY
// while (fscanf(dictionaryInputFile, "%c", c) != EOF)
while (fscanf(dictionaryInputFile, "%c", &c) != EOF)
没有防止溢出的保护措施。
// str[index] = c; //add char to string
if (index >= MAX_WORD_SIZE - 1) Handle_TooManySomehow();
不知道为什么要针对'\0'
何时进行测试'\0'
也是非alpha的。
isalpha()
就签名而言,在学上来说是有问题的char
。更好地传递unsigned char
价值:is...((unsigned char) c))
当代码知道它是不是EOF
。或者,使用int ch = fgetc(stream)
和保存输入is...(ch))
。
次要:比更好地size_t
用于数组索引int
,但要小心,因为它size_t
是无符号的。与这种情况不同,size_t
数组变大很重要。
同样,EOF
接收到的任何数据都将str
被忽略,即使其中包含一个单词也是如此。@BLUEPIXY。
在大多数情况下,OP处于正确的轨道上。
以下是一种未经测试的示例方法,以说明缓冲区没有溢出。
测试是否有完整的缓冲区,然后在char
需要时读取。如果找到非字母,则如果累积了非零长度的作品,则添加到字典中。
char str[MAX_WORD_SIZE];
int ch;
size_t index = 0;
for (;;) {
if ((index >= sizeof str - 1) ||
((ch = fgetc(dictionaryInputFile)) == EOF) ||
(!isalpha(ch))) {
if (index > 0) {
str[index] = '\0';
dictionaryRoot = insertNode(str, dictionaryRoot);
index = 0;
}
if (ch == EOF) break;
}
else {
str[index++] = tolower(ch);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句