1、将数据格式化输出到字符串.
(1)函数1 int sprintf_s(char *restrict buffer, rsize_t bufsz, const char *restrict format, ...);
(2)函数2:int sprintf( char *buffer, const char *format, [ argument] … );
buffer:待存入字符串,bufsz:待写入缓冲区大小
format:待存入格式,%[指定参数$][标识符][宽度][.精度]指示符
[argument]...:可选参数,可以是任何类型的数据。
%c | 整数转成对应的 ASCII 字元 |
%d | 整数转成十进位。 |
%f | 把精确度数字转成浮点数 |
%o | 整数转成八进位。(字母o) |
%s | 整数转成字串。 |
%x | 整数转成小写十六进位 |
%X | 整数转成大写十六进位。 |
sprintf_s()是sprintf()的安全版本,通过指定缓冲区长度来避免sprintf()存在的溢出风险。
直接上代码:
#include <iostream>
using namespace std;
int main()
{
char ch[20] = { 0 };
int nValue = 812446;
sprintf_s(ch, sizeof(ch)-1, "%X", nValue);
//sizeof(ch)-1的大小必须大于等于待写入字符串的大小,否则会出错。
float fValue = 0.35456;
char ch1[20] = { 0 };
sprintf_s(ch1,"%.3f",fValue);//可以不用指定
return 0;
}
他们之间的区别可参考:
sprintf_s、_snprintf与_snprintf_s_程序猿的专栏-CSDN博客
可以使用_snprintf_s函数,它比sprintf_s安全
//如下的数组赋值就不会发生溢出。
char ch[8] = { 0 };
float fValue = 0.35456;
int nValue = 87654321;
_snprintf_s(ch, sizeof(ch)-1, "%d", nValue);
2、字符串复制函数:strncpy_s()、strncpy()。
(1)语法形式为:char *strncpy_s(char *dest, const char *src, int n).
表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest。
(2)语法形式为:strncpy_s(char * restrict dest,rsize_t destsz,
const char * restrict src,rsize_t count);
这里多了一个长度,就是destsz,目标缓冲区的大小
直接上代码
#include <iostream>
struct stuVar1 {
char cName[30];
char cNumber[12];
};
struct stuVar2 {
int nCount;
char cSubJectName[50];
stuVar1 stu;
};
struct stuVar3 {
int nCount;
char cSubJectName[50];
char cName[30];
char cNumber[12];
};
void function1(stuVar2* stuSrc, stuVar3* stuDest) {
strncpy_s(stuDest->cName, stuSrc->stu.cName,29);
strncpy_s(stuDest->cNumber, stuSrc->stu.cNumber, 11);
strncpy_s(stuDest->cSubJectName, stuSrc->cSubJectName,49);
stuDest->nCount = stuSrc->nCount;
}
int main()
{
std::cout << "Hello World!\n";
stuVar1 stu1 = {sizeof(stuVar1),0}; //结构体初始化
const char* pName = "XiaoWang";
strncpy_s(stu1.cName, pName, sizeof(stu1.cName)-1);
const char* pNumber = "13235678967";
strncpy_s(stu1.cNumber, pNumber, sizeof(stu1.cNumber) - 1);
char dst1[6], src1[100] = "hello";
strncpy_s(dst1, 6, src1, 100);
stuVar2 stu2 = { sizeof(stuVar2),0 };
stu2.nCount = 2;
const char* pSubject = "Physical";
strncpy_s(stu2.cSubJectName, pSubject, sizeof(stu2.cSubJectName) - 1);
stu2.stu = stu1;
stuVar3 stu3 = {sizeof(stuVar3),0};
function1(&stu2, &stu3);
}
strncpy_s()函数比strncpy()函数安全,他们之间的区别如下:
strncpy_s_字符串 | Strings_C_参考手册_非常教程
3、字符串比较函数:
(1)char*字符串比较:int strcmp( const char *string1, const char *string2 )
(2)wchar_t字符串比较:int wcscmp( const wchar_t *string1, const wchar_t *string2 );
string1, string2 为以零值结尾的字符串所有版本的c运行库都支持
返回值
< 0 | string1 小于string2 |
0 | string1与string2相等 |
> 0 | string1 大于 string2 wcscmp 比较宽字符 |
4、C++中宏定义字符、参数替换:
[C++] C++中的宏定义详解 - zhizhiyu - 博客园
宏中#、##、__VA_ARGS__和##__VA_ARGS__的作用:
5、char字符串的分割: