0

当我加载少于 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;
}
4

5 回答 5

2

您不想将其限制为 5。
您真正想要的是确保读取工作正常且永不崩溃。

您不想在 5 个字符处停止阅读的原因是,如果用户输入超过 5 个字符,您在输入过程中已经停止阅读,您现在必须编写代码来找到该输入的结尾,然后继续. 编写代码来修复输入流很困难。而是进行输入验证(用户可能输入了废话,您可以生成错误消息),但您将在正确的位置继续阅读以进行下一个输入操作。

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
}
于 2013-10-27T16:32:00.177 回答
1

代替:

while (true)

放:

while (i < 5)
于 2013-10-27T16:17:54.193 回答
0

标准输入是一个流。你无法决定里面有什么。您所能做的就是从中读取并查看您得到了什么——或者您获得一些数据,或者您得知流已经结束。

如果你真的只想读取五个字节,你可以使用std::cin.read(tab, 5); 然后您必须调用std::cin.gcount()以查看实际读取了多少字节并且只消耗尽可能多的字节。

或者,您可以使用 C++ 的动态容器并用于std::getline(std::cin, line)读取std::string line尽可能多的数据,直到换行符为止。

在任何一种情况下,您首先进行阅读,然后检查您是否阅读以及实际阅读了多少,然后检查您阅读的内容是否符合您的预期(例如字母数字)。

于 2013-10-27T16:19:50.017 回答
0

对于 C 样式的数组,您必须将输入流的宽度设置为分配给缓冲区的字符数,否则您可能会写到数组末尾并导致缓冲区溢出。这通常使用以下方法完成ios_base::width

std::cin.width(5);
std::cin >> buffer;

您还可以使用操纵器std::setw

std::cin >> std::setw(5) >> buffer;

这些都将流的最大宽度设置为 5 个字符。第一次输入操作后,宽度将重置为默认值。

于 2013-10-27T16:35:42.077 回答
0

你的循环条件应该是

while(i < 5)

一个 for 循环也非常适合

 for(int i = 0; i < 5; i++) {
  // body
 }

您可以使用 STL 的算法部分来限制您的读取。例如 :

int main(){
    char c[5];
    auto newEnd = std::copy_n(std::istream_iterator<char>(std::cin), 5, std::begin(c));
    // if newEnd != c + 5 then it failed to read 5 characters

}
于 2013-10-27T16:55:21.413 回答