C++ C++;如何从标准输入加载到最多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)

当我加载少于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)  {
        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