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

文章探讨了C++中cin和cout与scanf和printf在处理字符串时的不同行为。cin和cout在操作string对象时会维护size属性,而scanf和printf则不会。特别是,scanf写入string时不会更新size,可能导致问题。cout在输出时仅考虑size,即使遇到也会继续输出。文章通过示例代码展示了这些差异,并提醒注意string.resize()的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

性能上就先不提了,很多文章都是在说明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’,在试验时影响到了测试结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值