c scanf类函数探幽 sscanf fscanf

scanf,  fscanf, sscanf

vscanf, vsscanf, vfscanf

函数原型

#include <stdio.h>

int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);

#include <stdarg.h>

int vscanf(const char *format, va_list ap);
int vsscanf(const char *str, const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap);

1.scanf

从标准输入读入字符。如果是字符串的话,遇到空格会停止

int a = 0;
scanf("%d",&a);
printf("a = %d", a);

再比如

int a = 0;
scanf("11%d",&a);
printf("a = %d", a);

必须要开头就直接输入11才能保证11后面的内容被读到。输入1122,a = 22

2.sscanf

从字符串中读入字符,可以用作将日期分解转换为int

#include <stdio.h>

int main()
{
	char temp[256];
	int year = 0;
	int month = 0;
	int day = 0;
	int hour = 0;
	int min = 0;
	int sec = 0;
	int flag = 0;
	int zoneh = 0;
	int zonem = 0;
	char buf[256] = "2017-11-02T17:06:31+08:00";
	sscanf(buf, "%4d-%2d-%2dT%2d:%2d:%2d",&year,&month,&day,&hour,&min,&sec);
	
	printf("year = %d\n",year);
	printf("month = %d\n",month);
	printf("day = %d\n",day);
	printf("hour = %d\n",hour);
	printf("min = %d\n",min);
	printf("sec = %d\n",sec);
        //year = 2017
        //month = 11
        //day = 2
        //hour = 17
        //min = 6
        //sec = 31
	
	return 0;
}

3.fscanf

从文件中读入字符

FILE* fp;
char buf[256];
fp = fopen("test.txt","r");
fscanf(fp,"%s",buf);
printf("buf = %s", buf);

4.vscanf

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

void my_vscanf(char *format, ...)
{
	char buf[256];
	snprintf(buf, sizeof(buf), "input:%s", format);
	va_list args;
	va_start(args, format);
	vscanf(buf, args);
	va_end(args);
}

int main()
{
	char a[256] = {0};
	my_vscanf("%s",&a);
	printf("a = %s\n",a);
	
	return 0;
}

vsscanf, vfscanf同理

scanf还有和正则表达式相似的功能,可以参考

https://blog.csdn.net/snailcpp/article/details/77075208

猜你喜欢

转载自blog.csdn.net/qq_34759481/article/details/81778228