理解【 fscanf 】 【 fprintf 】和【 sscanf 】 【 sprintf 】

本文介绍了fscanf, fprintf, sscanf, sprintf这四个格式化输入输出函数的用途和区别。fscanf和fprintf分别用于格式化输入和输出流,而sscanf和sprintf则用于从字符串中读取格式化数据或向字符串写入格式化数据。示例代码展示了它们在处理标准流和文件流时的效果。" 128040897,13449940,混沌粒子群优化Shubert函数:MATLAB实现与Logistic映射改进,"['算法', 'matlab', '优化']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能函数名适用于
格式化输入函数scanf标准输入流
格式化输出函数printf标准输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
函数名功能
sscanf把一个字符串的信息转换成格式化的数据
sprintf把格式化的数据转换成字符串

scanf 是从键盘上输入格式化的数据。
printf 是格式化打印信息到终端上。
他俩是针对标准输入流和输出流的,格式化的输入或输出语句。
fscanf 和 fprintf 针对所有流的(fscanf所有输入流,fprintf所有输出流)格式化输出语句。
sscanf 和sprintf是把一个字符串的信息转换成格式化的数据,把格式化的数据转换成字符串

【 fscanf 】 【 fprintf 】

fscanf是适用于标准输入流的格式化输出函数。
fprintf是适用于所有输出流的格式化输出函数。
当然,这两个函数也适用于标准输入流和输出流。

使用scanf 和printf 写出代码:

int main()
{
   int a = 0;
   char arr[10]  ={0};
   double d = 0.0;
   scanf("%d %s %lf",&a,arr,&d);
   printf("%d %s %lf\n",a,arr,d);
   return 0;
   }

打印出:
这里写图片描述

然而,我们把它改成fscanf 和 fprintf 看会出现什么效果?
我们知道,他们的参数必然有一个流的参数,通过MSDN查看,
这里写图片描述
我们发现第一个参数是流,所以我们的代码在上面的基础可以写成:

int main()
{
   int a = 0;
   char arr[10]  ={0};
   double d = 0.0;
   fscanf(stdin,"%d %s %lf",&a,arr,&d);
   fprintf(stdout,"%d %s %lf\n",a,arr,d);
   return 0;
   }

这里写图片描述
我们发现结果跟使用printf 和scanf 一模一样。在这里我们是作用于输入流和输出流
那么下面我们看看作用于文件又是什么样子?

int main()
{
   int a = 0;
   char arr[10]  ={0};
   double d = 0.0;
   FILE* pf = fopen("test.txt","w");  //打开这个文件
   fscanf(stdin,"%d %s %lf",&a,arr,&d);
   fprintf(pf,"%d %s %lf\n",a,arr,d);
   fclose(pf);  //关闭pf
   pf = NULL;
   system("pause");
   return 0;
}

这里写图片描述
这时候我们打开当前文件夹的text.txt文件,这里写图片描述
会提示该文件被修改,我们选择“是”后,再打开text.txt文件,会发现,我们写的内容被打印在text.txt文件中。
这里写图片描述

如果我们又想将内容读出来写在屏幕上:

int main()
{
   int a = 0;
   char arr[10]  ={0};
   double d = 0.0;
   FILE* pf = fopen("test.txt","r");  //打开这个文件
   fscanf(pf,"%d %s %lf",&a,arr,&d);
   fprintf(stdout,"%d %s %lf\n",a,arr,d);
   fclose(pf);  //关闭pf
   pf = NULL;
   system("pause");
   return 0;
}

这里写图片描述

这就是fprintf 和 fscanf(注意区别代码之间的细节)

【sscanf 】和【 sprintf】

【sscanf】

从MSDN上了解:
这里写图片描述
从一个字符串中读取格式化的数据。

【sprintf】

从MSDN上了解:
这里写图片描述
写一个格式化的数据到一个字符串中。

那这个时候,我们就有可能把一个结构体转换成一个字符串,也有可能把一个字符串转换成结构体。

话不多说,上代码:

struct S
{
    char name[20];
    int age;
    double score;
};
int main()
{
    struct S stu = {"zhangsan",20,98.5};
    char buf[100] = {0};
    sprintf(buf,"%s %d %lf",stu.name,stu.age,stu.score );
        //sprintf 的第一个参数是char *buffer我们把读的数据放到char *buffer 里。
    printf("%s\n",buf);   //再将其打印出来。
    return 0;
}

这里写图片描述
这个时候我们已经将结构体完美的转换成了字符串。

当然也可以字符串转换为结构体:这个时候我们用函数sscanf.

struct S
{
    char name[20];
    int age;
    double score;
};
int main()
{
    struct S stu = {"zhangsan",20,98.5};
    struct S tmp = {0};
    char buf[100] = {0};
    sprintf(buf,"%s %d %lf",stu.name,stu.age,stu.score );
    printf("%s\n",buf);
    sscanf(buf,"%s %d %lf",tmp.name ,&(tmp.age),&(tmp.score));
    //此时,我们已经把一个结构体变成了一个字符串,这个字符串存在于buf,我们现在要把buf里的字符串存到tmp里面去。这个函数可以从一个字符串中读一个格式化的数据,sscanf的第一个参数是buf,是我们从哪里读取数据。        //name是数组名,本来就是地址,&(tmp.age),&(tmp.score)这里要取地址,因为它是一个变量。
    printf("%s %d %lf\n",tmp.name,tmp.age,tmp.score);  //打印
        return 0;
}

这里写图片描述

sscanf的第一个参数是const char *buffer,我们从const char *buffer里读取数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值