gpt4 book ai didi

c - 从文件中读取数据,只有字母字符

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:29 25 4
gpt4 key购买 nike

我现在正在用 c 编写一个学校程序,但我无法从文件中读取文本。我以前只在 Java 工作过,所以我还不完全熟悉 c,这让我彻底难住了,尽管我确信它很简单。

这是一个示例,说明如何在我们必须阅读的文件中格式化文本:

boo22$Book5555bOoKiNg#bOo#TeX123tEXT(约翰)

我必须接受每个单词并将其存储在一个数据结构中,一个单词只有字母字符,所以没有数字或特殊字符。我已经让数据结构正常工作,所以我只需要将每个单词放入一个字符数组中,然后将其添加到我的结构中。它必须继续读取每个字符,直到它达到非字母字符值。我已经尝试研究从文件中扫描的不同方法,但我不确定哪种方法最适合我的情况。

这是我现在输入的代码:

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' 也是非 alpha 时,不确定为什么要针对 '\0' 进行测试。

迂腐地讲,isalpha() 在传递带符号的 char 时会出现问题。最好传递 unsigned char 值:is...((unsigned char) c)),当代码知道它不是 EOF 时。或者,使用 int ch = fgetc(stream) 保存输入并使用 is...(ch))

次要:对于数组索引,使用 size_tint 更好,但要小心,因为 size_t 是无符号的。 size_t 在数组变时很重要,这与本例不同。

此外,当接收到 EOF 时,str 中的任何数据都将被忽略,即使它包含一个单词。 @BLUEPIXY。

在大多数情况下,OP 的方向是正确的。


以下是一个未经测试的示例方法,用于说明不会溢出缓冲区。

测试缓冲区是否已满,然后在需要时读入 char。如果找到非 alpha,如果积累了非零长度的工作,则将其添加到字典中。

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

关于c - 从文件中读取数据,只有字母字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26109307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com