当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C语言 scanf() and fscanf()用法及代码示例


在C语言中,scanf()函数用于从 stdin 读取格式化输入。它返回写入其中的字符总数,否则返回负值。

用法:

int scanf(const char *characters_set)

时间复杂度:在)

辅助空间:O(n),其中 n 是输入的长度。

我们许多人都知道 scanf 的传统用法。好吧,这是一些 lesser-known 事实

如何只读取我们需要的部分输入?
例如,考虑一些仅包含字符后跟整数或浮点数的输入流。我们只需要扫描该整数或浮点数。

例子:

Input: "this is the value 100", 
Output: value read is 100
Input : "this is the value 21.2", 
Output : value read is 21.2

C


// 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

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

仅当输入字符串没有空格时,以下解决方案才有效。例如,

输入

"blablabla 25"

C


// 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 Value read : 25

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

scanf()的一般用法:

C


// C program to demonstrate general use of scanf()
#include <stdio.h>
int main()
{
    int a;
    scanf("%d", &a);
    printf("a = %d", a);
    return 0;
}

输入

2

输出

a = 2

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

C 中的 fscanf 函数

厌倦了从文件中读取所有笨拙的语法?好吧,fscanf 来救援了。该函数用于从 C 语言中的给定流中读取格式化输入。

用法:

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

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

返回值:如果不成功,它返回零或 EOF。否则,它返回成功打印的参数数量。

时间复杂度:在)

辅助空间:O(n),其中 n 是输入的长度。

示例 1:考虑以下文本文件 abc.txt

NAME    AGE   CITY
abc 12 hyderabad
bef 25 delhi
cce 65 bangalore

现在,我们只想读取上述文本文件的城市字段,忽略所有其他字段。 fscanf 和上面提到的技巧的组合可以轻松做到这一点

C


// C Program to demonstrate fscanf
#include <stdio.h>
// Driver Code
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    hyderabad
       bef     25    delhi
       cce     65    bangalore */
    char buf[100];
    while (fscanf(ptr, "%*s %*s %s ", buf) == 1)
        printf("%s\n", buf);
    return 0;
}

输出

CITY
hyderabad
delhi
bangalore

示例 2:考虑以下二进制文件program.bin

n1    n2    n3
1 5 6
2 10 11
3 15 16
4 20 21

要读取 bin 的 n1、n2 和 n3 的所有值,我们使用fscanf()

C


#include <stdio.h>
#include <stdlib.h>
struct threeNum{
    int n1, n2, n3;
};
int main(){
    int n;
    struct threeNum num;
    FILE *fptr;
    if ((fptr = fopen("program.bin","rb")) == NULL){
        printf("Error! opening file");
         // Program exits if the file pointer returns NULL.
         exit(1);
         }
     for(n = 1; n < 5; ++n){
         fread(&num, sizeof(struct threeNum), 1, fptr);
         printf("n1: %d\tn2: %d\tn3: %d", num.n1, num.n2, num.n3);
     }
     fclose(fptr);
     return 0;
}
//Code submitted by Susobhan Akhuli

输出

n1: 1   n2: 5   n3: 6
n1: 2 n2: 10 n3: 11
n1: 3 n2: 15 n3: 16
n1: 4 n2: 20 n3: 21

让我们以表格形式看看差异:

scanf() fscanf()
1. 它用于读取标准输入。 该函数用于从文件中读取输入
2.

它的语法是-:

scanf(const char *格式,...)

它的语法是-:

fscanf(FILE *stream, const char *format, …)

3. 它需要格式说明符来获取特定类型的输入。 它以字节的形式读取流
4.

它需要三个参数:

空白字符、非空白字符、格式说明符

它在头文件#include <stdio.h>中定义



相关用法


注:本文由纯净天空筛选整理自佚名大神的英文原创作品 scanf() and fscanf() in C。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。