c++数据格式化输出/字符串复制/字符串比较

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博客

https://blog.csdn.net/lanzhihui_10086/article/details/44221935?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

可以使用_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 );

string1string2 为以零值结尾的字符串所有版本的c运行库都支持

返回值

< 0

string1 小于string2

0

string1string2相等

> 0

string1 大于 string2

wcscmp 比较宽字符

4、C++中宏定义字符、参数替换:

 [C++] C++中的宏定义详解 - zhizhiyu - 博客园

宏中#、##、__VA_ARGS__和##__VA_ARGS__的作用:

https://blog.csdn.net/q2519008/article/details/80934815?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control

5、char字符串的分割:

strtok(), strtok_s() 字符串分割函数 - czhoud - 博客园

C++ 分割字符串两种方法 - 盛开的石头 - 博客园

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值