关于cin+cout与scanf+printf两套输入输出函数的不同

性能上就先不提了,很多文章都是在说明scanf+printf比cin+cout高效。

这两套函数在对字符串的处理上也有不同的逻辑。cin+cout可以与string相配套,没有问题,但scanf和printf如果对string进行操作可能会引发一些问题:

  • scanf会把扫描来的字符串写入string对应的地址中(string.c_str),并保证字符串以’\0’结尾,但这个函数不会维护string的size。
  • cin在输入时会维护string的size属性。
  • printf类似,只关心指定数据中的’\0’的位置,输出’\0’前的所有字符,与string的size无关。
  • cout在输出时仅受size影响,输出size长度的数据,即使字符串中有’\0’也不会停止,仅仅只是略过。但’\0’的行为在string中的情况比较复杂,以下是简单的测试:
string str1 = "test\0testaf";
char ch = '\0';
string sh = "\0";
string str2 = "tail";
string str3 = str1 + ch + str2;
string str4 = str1 + sh + str2;
cout << "str1 = " << str1 << "\tsize:" << str1.size() << "\tlength:" << str1.length() << endl;
cout << "str2 = " << str2 << "\tsize:" << str2.size() << "\tlength:" << str2.length() << endl;
cout << "str3 = " << str3 << "\tsize:" << str3.size() << "\tlength:" << str3.length() << endl;
cout << "str4 = " << str4 << "\tsize:" << str4.size() << "\tlength:" << str4.length() << endl;

运行结果:
'\0'测试

另外,需要注意string.resize会将数据区中的resize大小往后的数据填入’\0’,在试验时影响到了测试结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值