问题背景:

这几天一直在写密码学的实验内容,用的是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问题的自己的经历与解决方案相关推荐

  1. Vector使用报错:Expression:vector subscript out of range

    做题的时候遇到一个简单的排序题目: 一共有个学生,每个学生有两门成绩,主课成绩和副课成绩,先按照主课成绩排序,相同的情况下按照副课成绩排序,然后按照排序后的名单输出前名的名单: 这个题目确实很简单,却 ...

  2. PCL学习——基于B样条曲线的曲面建模程序中报错:Expression:vector subscript out of range

    本人在学习PCL中基于B样条曲线的曲面建模时,按照教程中的代码进行实操时程序报错 Expression:vector subscript out of range 经研究排查,出现此问题是由于程序中某 ...

  3. Excel 导入数据库中java.lang.StringIndexOutOfBoundsException: String index out of range: -50提示解决原因...

    dbf文件另存为.xls然后导入到sql数据库里会报错. java.lang.StringIndexOutOfBoundsException: String index out of range: - ...

  4. java.lang.StringIndexOutOfBoundsException: String index out of range: 0错误的原因

    2019独角兽企业重金招聘Python工程师标准>>> java.lang.StringIndexOutOfBoundsException: String index out of ...

  5. String index out of range: -4 错误解析

    报这个错误是由于对字符串进行操作的过程中抛出了StringIndexOutOfBoundsException异常 下面的几种方法均有可能抛出上述异常: String.substring() Strin ...

  6. OpenCV:vector subscript out of range

    报错 vector subscript out of range 源码 // 查找轮廓vector<vector<Point>> contours;vector<Vec4 ...

  7. java.lang.StringIndexOutOfBoundsException: String index out of range: -1

    在这里插入代码片 package com.itheima.d3_char_buffer; import java.io.*; import java.util.ArrayList; import ja ...

  8. 踩坑,String index out of range: -1,MultipartFile中getOriginalFilename()和getName方法

    我是方圆,这些天博客更的少,是因为在慢吞吞的敲项目和写作业 最终导致String index out of range: -1问题的是String.substring(),字符串越界嘛,因为我要截取图 ...

  9. 索引越位:String index out of range: 1

    一.String index out of range: 1 出现这种问题的原因,是因为字符串的索引越位. 报错内容: 报错位置: 报错原因:因为我循环使用的是字母"j",但是我写 ...

  10. java.lang.StringIndexOutOfBoundsException: String index out of range: 1

    笔者源码如下: package javaPractice;import java.util.*;public class TestScanner {public static void main(St ...

最新文章

  1. iis8.5 php mysql_Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
  2. leetcode 543. 二叉树的直径(Java版)
  3. android弹球动画,Android动画之自定义Evaluator实现弹球效果
  4. 《几何与代数导引》习题1.36.2
  5. AudioServicesPlaySystemSound
  6. TensorBoard 1.15.0 at http://DESKTOP-DV74NQ2:6006/ 打开html后无法展示解决方案
  7. Facebook开源问答系统DrQA:基于单一信源回答开放域提问
  8. QEMU中音频模拟工作过程(十)
  9. 【转】Swig 使用指南
  10. css 适配mac 字体,CSS:仅在mac上使用字体
  11. 单片机c语言1602怎么接线,lcd1602中文资料分享:lcd1602接线图_lcd1602与单片机连接图 - 全文...
  12. 常见电脑蓝屏代码以及解决办法
  13. 常见软件非功能性需求描述案例
  14. SpringBoot的报错找不到Mapper(解决:required a bean of type com.xxx.mapper.UserMapper that could not be found)
  15. JS 今天/明天的日期
  16. el-select 多选取值_Python实战—Lasso回归选取关键特征
  17. Matlab快捷键等总结
  18. CAD C#二次开发 圆和圆弧转Polyline线
  19. 使用 JABX 将 Map<String,String> 序列化成 <key>value</key>形式的字符串
  20. Dedecms页面关键字优化技巧

热门文章

  1. 嵌入式linux软件数据参数保存的三种方式
  2. 数字证书是什么,里面都包含那些内容
  3. 2018-01-20 HDU 4609 FFT 快速傅里叶变换
  4. [语义分割]CTNet: Context-based Tandem Network for Semantic Segmentation
  5. 把安卓手机屏幕投射到电脑上
  6. 如何使用Python解锁星河远征军的科幻旅途
  7. python 报错“xxx is not defined”
  8. html让光标位置,科技常识:html5中contenteditable 光标_如何设置光标位置
  9. linux内存中的文件权限,Linux系统管理(用户权限、磁盘存储、文件系统、内存、进程)...
  10. 信息安全技术——(九)基于MATLAB数字水印系统设计