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
相关产品推荐
相关产品推荐

