C++ C++;如何从标准输入加载到最多5个字母数字字符的字符数组?
当我加载少于5个字符时,就可以了。但是如果我加载的字符超过五个,我的程序就会崩溃。 在那之前我该如何保护自己C++ C++;如何从标准输入加载到最多5个字母数字字符的字符数组?,c++,arrays,C++,Arrays,当我加载少于5个字符时,就可以了。但是如果我加载的字符超过五个,我的程序就会崩溃。 在那之前我该如何保护自己 #include <iostream> #include <cstdlib> using namespace std; int main() { char tab[5]; int tab2[5]; char *wsk = tab; int i = 0; cin >> tab; while (true)
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
char tab[5];
int tab2[5];
char *wsk = tab;
int i = 0;
cin >> tab;
while (true) {
cin >> tab2[i];
if (tab2[i] == 0) break;
i++;
}
i = 0;
while (true) {
if (tab2[i] ==0) break;
wsk += tab2[i];
cout << *wsk;
i++;
}
return 0;
}
#包括
#包括
使用名称空间std;
int main(){
字符标签[5];
int tab2[5];
char*wsk=tab;
int i=0;
cin>>选项卡;
while(true){
cin>>表2[i];
如果(tab2[i]==0)中断;
i++;
}
i=0;
while(true){
如果(tab2[i]==0)中断;
wsk+=tab2[i];
不能而不是:
while (true)
付诸表决:
while(i<5)
而不是:
while (true)
付诸表决:
while(i<5)
而不是:
while (true)
付诸表决:
while(i<5)
而不是:
while (true)
付诸表决:
while(i<5)
标准输入是一个流。你不需要决定其中包含什么。你所能做的就是从中读取并查看得到的内容——要么你得到一些数据,要么你知道流已经结束
如果您确实只想读取五个字节,那么可以使用std::cin.read(选项卡,5)
;然后必须调用std::cin.gcount()
,查看实际读取了多少字节,并且只消耗同样多的字节
或者,您可以使用C++的动态容器,并使用std::getline(std::cin,line)
来读取std::string行中的数据,直到换行
在任何一种情况下,您都要先阅读,然后检查您是否阅读以及实际阅读量,然后检查您阅读的内容是否符合您的预期形式(例如字母数字).标准输入是一个流。你不需要决定其中包含什么。你所能做的就是从中读取并查看得到的内容——要么你得到一些数据,要么你知道流已经结束
如果您确实只想读取五个字节,那么可以使用std::cin.read(选项卡,5)
;然后必须调用std::cin.gcount()
,查看实际读取了多少字节,并且只消耗同样多的字节
或者,您可以使用C++的动态容器,并使用std::getline(std::cin,line)
来读取std::string行中的数据,直到换行
在任何一种情况下,您都要先阅读,然后检查您是否阅读以及实际阅读量,然后检查您阅读的内容是否符合您的预期形式(例如字母数字).标准输入是一个流。你不需要决定其中包含什么。你所能做的就是从中读取并查看得到的内容——要么你得到一些数据,要么你知道流已经结束
如果您确实只想读取五个字节,那么可以使用std::cin.read(选项卡,5)
;然后必须调用std::cin.gcount()
,查看实际读取了多少字节,并且只消耗同样多的字节
或者,您可以使用C++的动态容器,并使用std::getline(std::cin,line)
来读取std::string行中的数据,直到换行
在任何一种情况下,您都要先阅读,然后检查您是否阅读以及实际阅读量,然后检查您阅读的内容是否符合您的预期形式(例如字母数字).标准输入是一个流。你不需要决定其中包含什么。你所能做的就是从中读取并查看得到的内容——要么你得到一些数据,要么你知道流已经结束
如果您确实只想读取五个字节,那么可以使用std::cin.read(选项卡,5)
;然后必须调用std::cin.gcount()
,查看实际读取了多少字节,并且只消耗同样多的字节
或者,您可以使用C++的动态容器,并使用std::getline(std::cin,line)
来读取std::string行中的数据,直到换行
在这两种情况下,您都要先阅读,然后检查您是否阅读以及实际阅读量,然后检查您阅读的内容是否符合您的预期格式(例如字母数字)。您不想将其限制为5。
您真正想要的是确保read工作正常且永不崩溃
你不想停止读取5个字符的原因是,如果用户输入超过5个字符,则在输入的中间停止读取,现在必须编写代码来查找输入的结束,然后继续。编写代码来修复输入流是困难的,而不是输入验证。(用户可能键入了crap,您可以生成错误消息),但您将在正确的位置继续阅读下一个输入操作
char tab[5];
cin >> tab; // Fails if you read more than 4 input characters
// (because it will add '\0' on the end)
为什么不使用自扩展的目标结构呢
std::string tab;
std::cin >> tab; // Read one word whatever the size.
但是阵列呢。
没有更多的困难。这里你需要一个重新调整大小的数组。猜猜我们有什么std::vector
int tab2[5];
while (true) {
cin >> tab2[i]; // Fails on the 6 number you input.
// STUFF
}
循环可以这样写:
std::vector<int> tab2;
while (true) {
int val;
cin >> val;
tab2.push_back(val);
// STUFF
}
std::vector tab2;
while(true){
int-val;
cin>>val;
表2.推回(val);
//东西
}
您不想将其限制为5。
您真正想要的是确保read工作正常且永不崩溃
你不想停止读取5个字符的原因是,如果用户输入超过5个字符,则在输入的中间停止读取,现在必须编写代码来查找输入的结束,然后继续。编写代码来修复输入流是困难的,而不是输入验证。(用户可能键入了crap,您可以生成错误消息),但您将在正确的位置继续阅读下一个输入操作
char tab[5];
cin >> tab; // Fails if you read more than 4 input characters
// (because it will add '\0' on the end)
为什么不使用自扩展的目标结构呢
std::string tab;
std::cin >> tab; // Read one word whatever the size.
但是阵列呢。
没有更多的困难。这里你需要一个重新调整大小的数组。猜猜我们有什么std::vector
int tab2[5];
while (true) {
cin >> tab2[i]; // Fails on the 6 number you input.
// STUFF
}
循环可以这样写:
std::vector<int> tab2;
while (true) {
int val;
cin >> val;
tab2.push_back(val);
// STUFF
}
std::vector tab2;
while(true){
int-val;
cin>>val;
表2.推回(val);
//东西
}
您不想将其限制为5。
你真正想要的是确保读到w