You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:20:44