如何使用fscanf跳过文件中的内容?

时间:2015-10-20 02:56:56

标签: c string scanf

我正在学习C文件操作,我有一个特定的问题,我需要将字母(A-Z,a-z)存储为从文件中读取的字符串。所以,如果我有abcd&*dvcd,那么abcd是一个字符串,dvcd是一个字符串。

基本上我有两个问题:

  1. 我不知道要预先存储的字符串的大小。
  2. 我需要跳过非字母字符
  3. 我以为我会通过使用fscanf格式字符串来解决这两个问题。这是我的想法。我需要以某种方式跳过使用fscanf格式字符串来查找我在文件中的位置。然后,我可以从保存的起始位置中减去找到我需要malloc的字符串。然后,我malloc特定长度的字符串,然后,我可以回到保存的位置并实际读取它。

    但是,我不知道如何告诉fscanf不存储扫描的字符串?

    或者是否有其他方法允许跳过非字母字符?

2 个答案:

答案 0 :(得分:0)

您可以使用格式说明符,例如"%[a-zA-Z]"在fscanf中的格式说明符。 如下例所示,

#include<stdio.h>
int main()
{
        char a[10];
        fscanf(stdin, "%[a-zA-Z]", a);
        printf("%s\n",a);
}

在此示例中,它仅在stdin中读取字母。它会跳过非字母字符。

答案 1 :(得分:0)

自@ suresh&#39;答案是not working for me(输出应该是asd gddf而不是asd asd),我已经写了另一个版本,这个版本不是很短,但对我来说效果很好:

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

int main(void) {
    char ch;
    while(scanf("%1c", &ch) == 1) { //while we have characters to read
        if(isalpha(ch)) { // if the next one is alphanumeric
            ungetc(ch, stdin); // we put it back
            char str[101];
            scanf("%100[a-zA-Z]", str); // to read the whole string (including that char)
            printf("found string %s\n", str);
        }
    }
    return 0;
}

Here是一个有效的例子。我使用stdin来做这个,但你可以很容易地使用它来使用你打开的另一个文件。我用于scanf%100[a-zA-Z]])的格式说明符意味着它应该只读取包含小写或大写字母的最多100个字符(str的大小)。 %1c表示单个字符,unget将字符放回缓冲区,以避免在不是符号的情况下跳过它。

编辑:正如@m-m所指出的,在方括号内使用-不是标准的,在某些实现中可能不可用。如果您无法使用,则可以始终使用%100[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]