C++ string输入与长度获取失败的技术咨询
C++字符串读取与长度获取的错误解析
第3行与第4行的差异
第3行
scanf("%s %s", &s1, &s2)失效原因:scanf是C语言标准输入函数,%s要求对应的参数是指向字符数组的char*指针。但std::string是C++类对象,&s1取到的是整个string对象的内存地址,而非其内部存储字符的缓冲区指针。直接用scanf操作该地址会破坏string的内部结构(比如存储长度、缓冲区地址的成员变量),属于非法操作,必然触发未定义行为。第4行
cin >> s1, s2的真相:
这是逗号表达式,执行逻辑是先运行cin >> s1读取输入到s1,之后仅返回s2但不做任何输入操作。也就是说s2完全没被赋值,还是默认构造的空字符串——这是后续所有长度错误的根源!正确写法应为cin >> s1 >> s2;,才能依次读取两个字符串到s1和s2。
长度获取方法失效的原因
s2.length()输出0:因为s2是空字符串(未被cin赋值),length()返回空字符串的长度0,这是符合逻辑的结果,只是你误以为s2已被赋值。sizeof(s2.c_str())输出8:s2.c_str()返回const char*类型指针,64位操作系统中指针的固定大小为8字节。sizeof计算的是指针本身的内存大小,和字符串实际长度无关,用它求字符串长度属于用法错误。strlen(s2.c_str())输出0:strlen从指针指向位置开始计数,直到遇到'\0'停止。s2是空字符串,c_str()返回指向单个'\0'的指针,因此strlen计数到第一个'\0'就停止,返回0。
修正后的示例代码
#include <iostream> #include <string> #include <cstring> int main(){ std::string s1, s2; std::cin >> s1 >> s2; // 正确读取两个字符串 int s2len = s2.length(); // 此时返回3,符合预期 int s2len_strlen = std::strlen(s2.c_str()); // 同样返回3 std::cout << s2len << " " << s2len_strlen << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Naufal Zafran Fadil
相关产品推荐
相关产品推荐

