关于c++产生string subscript out of range问题的自己的经历与解决方案
问题背景:
这几天一直在写密码学的实验内容,用的是c++写的,软件是visual studio 2022。本来用的是c写的,但是在用scanf_s()时出现了我无法解决的问题(因为vs不让你使用scanf(),有加个前缀的方法能解决,但是出于安全性考虑,还是用了scanf_s()),而且网上对scanf_s()的用法以及会出现的问题讲解都很少,所以索性放弃了c,改用c++,顺便就当回顾上学期学习的c++。
问题描述:
用到了string和引用&,出现了string subscript out of range的问题(截图就不发了),下面只展示部分关键代码。
#include <iostream>
#include <string>using namespace std;//加密算法函数
void EncryptVigenere(string& plain_text, string& key, string& decrypt_text)
{//省略很多decrypt_text[i] = (plain_text[i] - 'A' + key[j] - 'A') % 26 + 'A';//省略很多
}//main函数
int main()
{string plain_text;string key;string decrypt_text;//省略很多cout << "请输入要加密的字符串:" << endl;getline(cin, plain_text);cout << "请输入密钥:" << endl;getline(cin, key);EncryptVigenere(plain_text, key, decrypt_text);cout << "得到的密文为:" << decrypt_text << endl;//省略很多return 0;
}
原因分析:
最初看到这个报错的时候,我也很疑惑,那就上网搜吧。网上的说法就是string要初始化,我也照做了,如下,的确成功了:
string plain_text(500,0);
string key(100,0);
string decrypt_text(500,0);
我以为就这样能轻松的解决了,实则不然。在第二个密码学实验中,我使用了同样的方法,然而出现了问题。不展示了,就直接描述。就是在输出后多了很多空行,但实际代码中得到的结果不应该这样啊。
针对第二个实验,我首先进行了对项目的调试,发现在一个循环里似乎有很多次操作,远远大于想要的长度,就比如20,它似乎循环了几百次。那时我似乎有点明白道理了,应该是我赋值的字符串长度导致的,同第一个实验我赋了个500。然后再用调试打印该字符串的长度,果然是500。
至此,我意识到不能简简单单的这样赋值,需要更改写法。
解决方案:
所以之后我就不断在网上以及书上查阅相关的资料,经过不断的尝试后,我找到了比较好的方法:
字符串必须需要初始化,不初始化必定会报错,但初始化的方式可以有多种,以下我只写在本次实验中的赋值方式。
//1.输入赋值
getline(cin,key);//2.string(长度,值);
string plain_text(500,0);
而第一种方式其实是我一直所忽略的,为什么这么说呢?
string key; //注意就是这样写,而不是string(100,0);
getline(cin,key);
这种赋值方式会改变key的长度!!!那么可以这样想第一个实验的更优解以及更深次的问题,就是decrypt_text并没有初始化,就访问了下标,所以更好的解决方案就可以如下:
//加密算法函数
void EncryptVigenere(string& plain_text, string& key, string& decrypt_text)
{//省略很多//修改的地方decrypt_text.assign(plain_text_length,0);decrypt_text[i] = (plain_text[i] - 'A' + key[j] - 'A') % 26 + 'A';//省略很多
}
其他地方都不要变,包括main方法里只需要写类似即可:
string plain_text;
string key;
string decrypt_text;
这种修改方法就是说在输入的时候已经对plain_text和key赋值了,而decrypt_text还没有赋值,所以在加密函数中将decrypt_text初始化明文长度个0(假设明文和密文长度相同)。那么自然而然这种做法牵扯到第二个实验中,就不会产生有多余空行的问题了。
新人第一次发布,如有问题,还请多多指正!
关于c++产生string subscript out of range问题的自己的经历与解决方案相关推荐
- Vector使用报错:Expression:vector subscript out of range
做题的时候遇到一个简单的排序题目: 一共有个学生,每个学生有两门成绩,主课成绩和副课成绩,先按照主课成绩排序,相同的情况下按照副课成绩排序,然后按照排序后的名单输出前名的名单: 这个题目确实很简单,却 ...
- PCL学习——基于B样条曲线的曲面建模程序中报错:Expression:vector subscript out of range
本人在学习PCL中基于B样条曲线的曲面建模时,按照教程中的代码进行实操时程序报错 Expression:vector subscript out of range 经研究排查,出现此问题是由于程序中某 ...
- Excel 导入数据库中java.lang.StringIndexOutOfBoundsException: String index out of range: -50提示解决原因...
dbf文件另存为.xls然后导入到sql数据库里会报错. java.lang.StringIndexOutOfBoundsException: String index out of range: - ...
- java.lang.StringIndexOutOfBoundsException: String index out of range: 0错误的原因
2019独角兽企业重金招聘Python工程师标准>>> java.lang.StringIndexOutOfBoundsException: String index out of ...
- String index out of range: -4 错误解析
报这个错误是由于对字符串进行操作的过程中抛出了StringIndexOutOfBoundsException异常 下面的几种方法均有可能抛出上述异常: String.substring() Strin ...
- OpenCV:vector subscript out of range
报错 vector subscript out of range 源码 // 查找轮廓vector<vector<Point>> contours;vector<Vec4 ...
- java.lang.StringIndexOutOfBoundsException: String index out of range: -1
在这里插入代码片 package com.itheima.d3_char_buffer; import java.io.*; import java.util.ArrayList; import ja ...
- 踩坑,String index out of range: -1,MultipartFile中getOriginalFilename()和getName方法
我是方圆,这些天博客更的少,是因为在慢吞吞的敲项目和写作业 最终导致String index out of range: -1问题的是String.substring(),字符串越界嘛,因为我要截取图 ...
- 索引越位:String index out of range: 1
一.String index out of range: 1 出现这种问题的原因,是因为字符串的索引越位. 报错内容: 报错位置: 报错原因:因为我循环使用的是字母"j",但是我写 ...
- java.lang.StringIndexOutOfBoundsException: String index out of range: 1
笔者源码如下: package javaPractice;import java.util.*;public class TestScanner {public static void main(St ...
最新文章
- iis8.5 php mysql_Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
- leetcode 543. 二叉树的直径(Java版)
- android弹球动画,Android动画之自定义Evaluator实现弹球效果
- 《几何与代数导引》习题1.36.2
- AudioServicesPlaySystemSound
- TensorBoard 1.15.0 at http://DESKTOP-DV74NQ2:6006/ 打开html后无法展示解决方案
- Facebook开源问答系统DrQA:基于单一信源回答开放域提问
- QEMU中音频模拟工作过程(十)
- 【转】Swig 使用指南
- css 适配mac 字体,CSS:仅在mac上使用字体
- 单片机c语言1602怎么接线,lcd1602中文资料分享:lcd1602接线图_lcd1602与单片机连接图 - 全文...
- 常见电脑蓝屏代码以及解决办法
- 常见软件非功能性需求描述案例
- SpringBoot的报错找不到Mapper(解决:required a bean of type com.xxx.mapper.UserMapper that could not be found)
- JS 今天/明天的日期
- el-select 多选取值_Python实战—Lasso回归选取关键特征
- Matlab快捷键等总结
- CAD C#二次开发 圆和圆弧转Polyline线
- 使用 JABX 将 Map<String,String> 序列化成 <key>value</key>形式的字符串
- Dedecms页面关键字优化技巧
热门文章
- 嵌入式linux软件数据参数保存的三种方式
- 数字证书是什么,里面都包含那些内容
- 2018-01-20 HDU 4609 FFT 快速傅里叶变换
- [语义分割]CTNet: Context-based Tandem Network for Semantic Segmentation
- 把安卓手机屏幕投射到电脑上
- 如何使用Python解锁星河远征军的科幻旅途
- python 报错“xxx is not defined”
- html让光标位置,科技常识:html5中contenteditable 光标_如何设置光标位置
- linux内存中的文件权限,Linux系统管理(用户权限、磁盘存储、文件系统、内存、进程)...
- 信息安全技术——(九)基于MATLAB数字水印系统设计