字符串的格式化sprintf与sscanf详解

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串的格式化sprintf与sscanf详解相关的知识,希望对你有一定的参考价值。

sprintf

sprintf 基本知识

头文件

#include <stdio.h>

函数声明

int sprintf(char *str, const char *format, ...);

功能:

根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到 出现字符串结束符 ‘\\0’ 为止。

参数:

str:字符串首地址
format:字符串格式,用法和printf()一样

返回值:

成功:实际格式化的字符个数
失败: - 1

sprintf 常见用法

格式化字符串

//1. 格式化字符串
char buf[1024] = { 0 };
sprintf(buf, "你好,%s,欢迎加入我们!", "露露");
printf("buf的内容是:%s\\n", buf);

memset(buf, 0, 1024);
sprintf(buf, "我今年%d岁了!", 20);
printf("露露说:buf:%s\\n", buf);

拼接字符串

//2. 拼接字符串
memset(buf, 0, 1024);
char str1[] = "hello";
char str2[] = "world";
int len = sprintf(buf, "%s %s", str1, str2);
printf("buf:%s len:%d\\n", buf, len);

数字转字符串

//3. 数字转字符串
memset(buf, 0, 1024);
int num = 100;
sprintf(buf, "%d", num);
printf("数字转字符串 buf:%s\\n", buf);
//设置宽度 右对齐
memset(buf, 0, 1024);
sprintf(buf, "%8d", num);
printf("右对齐buf:%s\\n", buf);
//设置宽度 左对齐
memset(buf, 0, 1024);
sprintf(buf, "%-8d", num);
printf("左对齐buf:%s\\n", buf);
//转成16进制字符串
memset(buf, 0, 1024);
sprintf(buf, "0x%x", num);
printf("16进制buf:%s\\n", buf);

//转成8进制字符串
memset(buf, 0, 1024);
sprintf(buf, "0%o", num);
printf("8进制buf:%s\\n", buf);


更多格式可以参考我的另一篇博客:https://yangyongli.blog.csdn.net/article/details/120522117

sscanf

sscanf 基本知识

头文件

#include <stdio.h>

函数声明

int sscanf(const char *str, const char *format, ...);

功能:

从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。

参数:

str:指定的字符串首地址
format:字符串格式,用法和scanf()一样

返回值:

成功:成功则返回参数数目,失败则返回-1
失败: - 1

%输入格式含义

格式作用
%*s或%*d跳过数据
%[width]s读指定宽度的数据
%[a-z]匹配a到z中任意字符(尽可能多的匹配)
%[aBc]匹配a、B、c中一员,贪婪性
%[^a]匹配非a的任意字符,贪婪性
%[^a-z]表示读取除a-z以外的所有字符

sccanf 常见用法

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

//1. 跳过数据
void test01() {
	char buf[1024] = { 0 };
	//跳过前面的数字
	//匹配第一个字符是否是数字,如果是,则跳过
	//如果不是则停止匹配
	sscanf("123456aaaa", "%*d%s", buf);
	printf("跳过数据 buf:%s\\n", buf);
	printf("----------------------------\\n");
}

//2. 读取指定宽度数据
void test02() {
	char buf[1024] = { 0 };
	sscanf("123456aaaa", "%7s", buf);
	printf("读取指定宽度数据 buf:%s\\n", buf);
	printf("----------------------------\\n");
}

//3. 匹配a-z中任意字符
void test03() {
	char buf[1024] = { 0 };
	//先匹配第一个字符,判断字符是否是a-z中的字符,如果是匹配
	//如果不是停止匹配
	sscanf("abcdefg123456", "%[a-z]", buf);
	printf("匹配a-z中任意字符 buf:%s\\n", buf);
	printf("----------------------------\\n");
}

//4. 匹配aBc中的任何一个
void test04() {
	char buf[1024] = { 0 };
	//先匹配第一个字符是否是aBc中的一个,如果是,则匹配,如果不是则停止匹配
	sscanf("abcdefg123456", "%[aBc]", buf);
	printf("匹配aBc中的任何一个 buf:%s\\n", buf);
	printf("----------------------------\\n");
}

//5. 匹配非a的任意字符
void test05() {
	char buf[1024] = { 0 };
	//先匹配第一个字符是否是aBc中的一个,如果是,则匹配,如果不是则停止匹配
	sscanf("bcdefag123456", "%[^a]", buf);
	printf("匹配非a的任意字符 buf:%s\\n", buf);
	printf("----------------------------\\n");
}

//6. 匹配非a-z中的任意字符
void test06() {
	char buf[1024] = { 0 };
	//先匹配第一个字符是否是aBc中的一个,如果是,则匹配,如果不是则停止匹配
	sscanf("123456ABCDbcdefag", "%[^a-z]", buf);
	printf("匹配非a-z中的任意字符 buf:%s\\n", buf);
	printf("----------------------------\\n");
}
int main()
{
	test01();
	test02();
	test03();
	test04();
	test05();
	test06();
	return 0;
}

输出结果:

以上是关于字符串的格式化sprintf与sscanf详解的主要内容,如果未能解决你的问题,请参考以下文章

sprintf() 和 sscanf()

sscanf,sprintf

字符与数字的转换:sprintf和sscanf

C语言sprintf与sscanf函数[总结]

C语言sprintf与sscanf函数[总结]

C语言sprintf与sscanf函数[总结]