问题遇到的现象和发生背景
输入一个四位数,将其加密后输出。加密的规则如下:将该数每一位上的数字加9,然后除以10取余作为该位上的新数字,将千位和十位上的数字互换、百位和个位上的数字互换,组成加密后的新数字。高位若为0的也要输出。
我的写代码如下
#include<iostream>
using namespace std;
int main() {
char a[4];
cin >> a;//输入四位数
for (int i = 1; i <= 4;i++){//将该数每一位上的数字加9,然后除以10取余作为该位上的新数字
a[i] = (a[i] + 9) % 10;
}
char x;//千位和十位上的数字互换
x = a[1];
a[1] = a[3];
a[3] = x;
x = a[2];//百位和个位上的数字互换
a[2] = a[4];
a[4] = x;
cout << a << endl;//加密后输出
return 0;
}
运行错误列表
严重性 代码 说明
警告 C6385 正在从 "a" 读取无效数据。
警告 C6201 索引“4”超出了“0”至“3”的有效范围(对于可能在堆栈中分配的缓冲区“a”)。
警告 C6201 索引“4”超出了“0”至“3”的有效范围(对于可能在堆栈中分配的缓冲区“a”)。
警告 C6386 写入 "a" 时缓冲区溢出。
错误 C4789 缓冲区“a”(大小为 4 字节)将溢出;1 字节将在偏移 4 时开始写入
我的解答思路和尝试过的方法
我在在这次编程过程中才学会数组使用方法,所以我打算尝试检验数组运用是不是出错了,于是删除交换那部分
#include<iostream>
using namespace std;
int main() {
char a[4];
cin >> a;
cout << a << endl;
return 0;
}
结果运行后出现报错
复制详细信息
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.
我参考的是https://blog.csdn.net/Watremelon/article/details/123796149?ops_request_misc=&request_id=&biz_id=102&utm_term=a(i)&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-123796149.142^v66^control,201^v3^add_ask,213^v2^t3_esquery_v2&spm=1018.2226.3001.4187
这篇文章中第一幅图就是用的这个结构啊,为什么我用会报错(注:我搜过这个错误解决方法,但都是在说将循环从1开始调整为从0开始,但是我没用循环啊)
我想要达到的结果
我主要想使第一个程序能成功运行,第二个作为好奇,想知道为什么。