数组字符包含量超出预期
Array character holding more than expected
我对下面的代码感到困惑...请澄清。
当我使用此代码时:
#include<iostream>
using namespace std;
int main()
{
char array[10];
cin>>array;
int i=0;
while(array[i]!=' ')
{
cout<<array[i];
i++;
}
}
并给出输入:qwertyuiop
- 10 个字符。它的输出再次qwertyuiop
。
但是当我按照下面给出的代码初始化数组时,它给出了字符串对于数组来说太长的错误!解释?
#include <iostream>
using namespace std;
int main() {
char array[10]="qwertyuiop";
int i=0;
while(array[i]!=' ')
{
cout<<array[i];
i++;
}
}
下面是
缓冲区溢出的示例。输入字符串在 array
结束后重写一些字节。但这是一个运行时问题,无法在编译时检测到。
代码的真正问题是程序的行为是不确定的。有时程序可能会崩溃,有时不会。
您确实需要一个合理大小的缓冲区(例如 100 个或更多字符),并使用有限输入的方法。
第一个代码片段完全靠运气工作。您在只能容纳 9 个字符的数组中输入 10 个字符:在 C 样式字符串中,最后一个位置是终止0
所必需的。
它似乎由于两个(相关)原因而起作用:
- 您输入的字符不超过 9 个字符。尝试输入很多很多,程序肯定会崩溃。
- 碰巧,堆栈上这个数组之后的内存中一定有一个零。如果没有,输出循环将继续打印数据,直到内存不足或在其他任何地方遇到
0
。
所以这在技术上是"缓冲区溢出"。
第二个代码段中的错误是因为您的编译器知道您不应该将 n 个字符存储在长度为 n 的数组中 - 它指出没有终止0
的空间。
相关文章:
- 如何反转整数参数包
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- cmake如何在fedora工作站中找到boost静态库包
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何将enable-if与模板参数和参数包一起使用
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 创建具有汇编名称中特殊字符的Nuget软件包
- 数组字符包含量超出预期
- 在c++中将字符数组解包为字符串