c - 从文件中读取数据,仅包含字母字符

标签 c

我现在正在用 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 索引是否为空。我猜我的 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' 进行测试。

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

次要:使用 size_t 作为数组索引比使用 int 更好,但要小心,因为 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/

相关文章:

c - XC8 : Cannot define auto array

c - 是 unsigned char a[4][5]; [1][7];未定义的行为?

c - 接受来自 scanf 函数的任意数量的输入

c - 在C中调整矩阵的大小

c - 尝试将结构指针作为节点发送到函数

c++ - 函数原型(prototype)中的参数名称

c - 使用 switch - C 后简单程序崩溃

c - Typedef 结构导致程序崩溃

c - 解析 CNAME,DNS 中的 NS 答案

我可以定义库所需的 C extern 函数而无需额外的编译步骤吗?