1

以下代码似乎在不应该运行时运行。在这个例子中:

#include <iostream>
using namespace std;
int main()
{
    char data[1];
    cout<<"Enter data: ";
    cin>>data;
    cout<<data[2]<<endl;
}

输入长度大于 1 的字符串(例如,“Hello”),将产生输出,就好像数组大到足以容纳它(例如,“l”)。当它尝试存储比数组长的值或尝试检索索引大于数组长度的值时,这是否应该引发错误?

4

3 回答 3

3

以下代码似乎在不应该运行时运行。

这与“应该”“不应该”无关。它是关于“可能”“可能不是”

也就是说,您的程序可能会运行,也可能不会。

这是因为您的程序调用了未定义的行为。访问超出数组长度的数组元素会调用未定义的行为,这意味着任何事情都可能发生。

编写代码的正确方法是std::string用作:

#include <iostream>
#include <string>

//using namespace std;  DONT WRITE THIS HERE

int main()
{
    std::string data;
    std::cout<<"Enter data: ";

    std::cin>>data; //read the entire input string, no matter how long it is!

    std::cout<<data<<std::endl; //print the entire string

    if ( data.size() > 2 ) //check if data has atleast 3 characters
    {
         std::cout << data[2] << std::endl; //print 3rd character 
    }
}
于 2012-06-12T07:48:54.357 回答
1

它可能会在编译或在其他机器上编译的不同参数下崩溃,因为根据文档运行该代码会给出未定义的结果。

于 2012-06-12T07:50:50.953 回答
1

这样做是不安全的。它正在做的是覆盖恰好位于缓冲区之后的内存。之后,它会将其读回给您。

这只是因为你的cincout操作没有说:这是一个指向一个字符的指针,我只会写一个字符。相反,它说:分配了足够的空间供我写入。cinand操作会一直读取数据,cout直到遇到空终止符\0

要解决此问题,您可以将其替换为:

std::string data;

C++ 会让你犯很大的内存错误。

一些“规则”可以为您节省大部分时间:

1:不要使用char[]。而是使用string.

2:不要使用指针来传递或返回参数。按引用传递,按值返回。

3:不要使用数组(例如int[])。使用vectors. 您仍然必须检查自己的界限。

只需这三个,您将编写一些“安全”代码和非 C 类代码。

于 2012-06-12T07:53:15.403 回答