C++固定大小字符串用cin输入时超出指定长度问题咨询
嘿,这个问题我之前踩过坑,来给你捋清楚原因和解决办法~
为啥会出现这种情况?
你用string s(length, '\0')初始化的字符串确实一开始长度是length,但C++的std::string是个动态可扩容的容器,它不会被初始长度限制死。当你用cin >> s输入时,这个操作的逻辑是忽略前导空白,然后一直读取到下一个空白字符为止——不管你原来的字符串有多大,它都会直接覆盖原有内容,要是输入的字符数超过了当前字符串的容量,string会自动申请更多内存来装这些字符,所以就出现了输入3却能存下整个Hello的情况。
解决办法
根据你的需求,这里有几个实用的方案:
1. 用cin.read()读取固定长度字符
如果你就是想精准读取length个字符(不管输入多长,只取前length个),可以用cin.read():
#include<bits/stdc++.h> using namespace std; int main(){ int length; cin>>length; // 必须忽略输入length后留下的换行符,不然read会把换行当成第一个字符读进去 cin.ignore(); string s(length, '\0'); cin.read(&s[0], length); cout<<s; }
比如输入3再输Hello,这里只会读取前3个字符Hel并输出,完美符合预期。
2. 用setw()限制输入长度
另一种更贴合你原来代码习惯的方法是用std::setw,它能直接限制cin >> s读取的字符数:
#include<bits/stdc++.h> using namespace std; int main(){ int length; cin>>length; string s; // 提前预留空间,避免不必要的内存扩容 s.reserve(length); // setw(n)表示最多读取n-1个非空白字符,所以要设为length+1才能读取最多length个字符 cin >> setw(length + 1) >> s; cout<<s; }
这样输入3再输Hello,最终s的内容就是Hel,和你想要的一致。
3. 读取后手动截断
如果已经用普通cin >> s读完了输入,之后想把字符串截断到length长度,也可以这么做:
#include<bits/stdc++.h> using namespace std; int main(){ int length; cin>>length; string s; cin>>s; if(s.size() > length){ s.resize(length); // 直接把字符串截断到指定长度 } cout<<s; }
这个方案适合需要先拿到完整输入,再做截断处理的场景。
内容的提问来源于stack exchange,提问作者ArcaneAce
相关产品推荐
相关产品推荐

