性能上就先不提了,很多文章都是在说明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;
运行结果:
另外,需要注意string.resize会将数据区中的resize大小往后的数据填入’\0’,在试验时影响到了测试结果。