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

C++中获取用户输入char数组大小不生效问题求解

问题原因分析

sizeof 是编译期运算符,它的计算结果在编译阶段就已经确定,作用是获取目标类型/变量占用的内存空间总大小,和运行时变量中存储的内容没有任何关系。同时你贴出的两段代码本身存在基础语法问题:数组定义语句末尾缺少分号,且没有引入<iostream>头文件、也没有声明std命名空间,直接编译会失败。

第一段代码无法得到预期结果的原因

  • 数组定义不合法:你写的char str[] = {} 属于零长度数组,这不是C++标准支持的语法,属于部分编译器的扩展实现。此时数组的内存大小在编译期就被确定为0,后续运行时不管你往里面输入什么内容,sizeof(str)的结果永远是编译期算出的0,不会跟着输入内容变化。
  • 存在严重的缓冲区溢出风险:零长度数组没有预留任何存储空间,用cin >> str往里面写入内容会直接越界访问内存,属于未定义行为,严重时会导致程序崩溃。
  • 概念混淆:你期望得到的是输入的字符串的长度,但sizeof只能得到数组本身的总空间大小,二者完全不是一回事。

第二段代码可以正常运行的原因

你写的char str[] = {"1234"} 用字符串字面量初始化数组,编译阶段编译器会自动推断数组的长度为5(4个可见字符 + 字符串末尾自动补的\0结束符),所以sizeof(str)在编译期就能算出结果为5,和你预期的结果一致,所以看起来运行正常。

正确实现方案

如果你要实现「获取用户输入的字符串长度」的需求,推荐两种写法:

方案1:固定长度char数组 + strlen计算长度

strlen是运行时函数,会从字符串起始位置开始查找\0结束符,统计到结束符之前的字符数,符合你要的运行时获取输入长度的需求:

#include <iostream>
#include <cstring> // 引入strlen的头文件
using namespace std;
int main()
{
    // 预先定义足够大的数组容量,注意预留结束符的位置
    char str[1024] = {0};
    cout << "Enter a characters ";
    cin >> str;
    // 用strlen计算实际输入的字符串长度
    int strLen = strlen(str);
    cout << strLen;
    return 0;
}

注意:该方案需要保证输入的字符数不超过数组容量-1,否则依然会出现缓冲区溢出问题。

方案2(C++推荐写法):使用std::string

直接使用C++标准库的字符串类,自动管理内存,不用操心容量和溢出问题:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str;
    cout << "Enter a characters ";
    cin >> str;
    // 直接调用size方法获取字符串长度
    cout << str.size();
    return 0;
}

内容的提问来源于stack exchange,提问作者Sho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:36:06