字符串的格式化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详解的主要内容,如果未能解决你的问题,请参考以下文章