c - 使用 fscanf() 获取格式化输入

标签 c scanf

我正在尝试从文本文件中读取非数字单词,这些单词可以用逗号、点、冒号或引号或诸如“之类的某种组合分隔。到目前为止我尝试的代码正在读取非数字单词字 正确,但保留分隔符。我使用 fscanf() 对吗?

int ReadWords(FILE* fp, char *words[])
{
    int i=0;
    char temp[50],tmp[50]; // assuming the words cannot be too long
    while (fscanf(fp,"%s%*[,.\":]",temp)==1) //ignore punctuation
    {
        if (isNumeric(temp))
            continue;
        printf("%s\n",temp);
        words[i] = strdup(temp);
        i++;
    }
    fclose(fp);
    // The result of this function is the number of words in the file
    return i;
}

我得到的输出类似于

emergency,"
"an
unknown
car
entered,

我需要这样

emergency
an
unknown
car
entered

最佳答案

%s 格式扫描“单词”,即连续的非空间 block 。这包括标点符号。

您想要扫描非数字单词,即仅扫描字母字符。对于这些字符,您可以像标点符号一样使用 %[...] 格式:

while (fscanf(fp, "%49[a-zA-Z]%*[^a-zA-Z]", temp) == 1) ...

注意事项:

  • 减号定义括号中的字符范围,除非它是第一个或最后一个字符,因此 %[a-zA-Z] 会扫描不带重音的拉丁字母。
  • 我在格式中添加了最大字长 49,这样就不会溢出字符缓冲区。
  • 我将除字母以外的任何内容都视为标点符号。这是一个简单的假设,但它将您的输入整齐地划分为字母/标点符号序列。您可以使用插入符号 ^ 作为括号内的第一个字母来否定要包含的字母。
  • 您可能应该首先扫描标点符号(可能是空的),以便真正的扫描以字母开头。

关于c - 使用 fscanf() 获取格式化输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26419108/

相关文章:

c - fscanf() 过滤器

C fscanf 段错误错误 "No source available for "fancyfile() at 0x7fff855e6d39"

C 跳过函数的一个命令?

c - 警告 : format '%ld' expects argument of type 'long int' , 但参数的类型为 '__builtin_neon_di'

c - 非阻塞网络地址解析(gethostbyname 或 getaddrinfo)?

c - 16 位唯一键到 8 位数组索引(完美哈希)

c - 如何在 C90 中方便地定义由包装在 union 内的函数指针组成的数组?

c - "Animated"文本输出

c - scanf读取每一个双错

c++ - getch() 和 scanf() 函数之间的区别