我们中的许多人都知道scanf的传统用法。好吧,这里有一些鲜为人知的事实

如何只阅读我们需要的部分输入?例如,考虑一些仅包含字符后跟整数或浮点数的输入流。我们需要只扫描整数或浮点数。
也就是说,
输入:“这是值100”,
输出:读取的值是100

输入:“这是值21.2”,
输出:读取的值是21.2

/* C program to demonstrate that we can
   ignore some string in scanf() */
#include <stdio.h>
int main()
{
    int a;
    scanf("This is the value %d", &a);
    printf("Input value read : a = %d", a);
    return 0;
}
// Input  : This is the value 100
// Output : Input value read : a = 100

现在,假设我们不知道前面的字符是什么,但我们肯定知道最后一个值是一个整数。我们如何将最后一个值扫描为整数?

以下解决方案仅在输入字符串没有空格时起作用。

/* Sample C program to demonstrate use of *s */
#include<stdio.h>
int main()
{
    int a;
    scanf("%*s %d", &a);
    printf("Input value read : a=%d",a);
    return 0;
}
// Input: "blablabla 25"
// Output: Value read : 25

说明:scanf中的%* s用于根据需要忽略某些输入。在这种情况下,它会忽略输入,直到下一个空格或新行。类似地,如果你写%* d,它将忽略整数,直到下一个空格或新行。

乍一看,上述事实似乎并不是一个有用的伎俩。为了理解它的用法,我们先来看看fscanf()。

fscand():厌倦了从文件中读取的所有丛生语法?好吧,fscanf来救援。

int fscanf(FILE * ptr,const char * format,...)

fscanf从FILE指针(ptr)指向的文件中读取,而不是从输入流中读取。

请考虑以下文本文件abc.txt

姓名年龄城市
abc 12 hyderbad
bef 25 delhi
cce 65班加罗尔

现在,我们只想读取上述文本文件的city字段,忽略所有其他字段。fscanf和上面提到的技巧的结合很容易实现

/*c program demonstrating fscanf and its usage*/
#include<stdio.h>
int main()
{
    FILE* ptr = fopen("abc.txt","r");
    if (ptr==NULL)
    {
        printf("no such file.");
        return 0;
    }
    /* Assuming that abc.txt has content in below
       format
       NAME    AGE   CITY
       abc     12    hyderbad
       bef     25    delhi
       cce     65    bangalore */
    char* buf[100];
    while (fscanf(ptr,"%*s %*s %s ",buf)==1)
        printf("%s\n", buf);
    return 0;
}

输出:

市
hyderbad
新德里
班加罗尔 

C中的scanf()和fscanf() – 简单而有力-IDC帮帮忙