C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用

发布时间:2023-05-20 13:00

本文是想用来记载作为菜菜的初学者的自己解决这个问题的过程><
如果是想康康最终的代码,直接通过目录到达“风暴叒一次来临(正确的道路)就可以啦”~
如果在代码输入之后出现了“未加载 wntdll.pdb”,这个解决方法是在“风暴叕一次来临(正确的道路)”
ps,最终结果也只是能运行出来,但是会提示“twoSortString.exe 已触发了一个断点”

目录

  • 发现错误
    • 题目
    • 报错的代码
  • 第一次挣扎(不改变strcpy)
    • 避免编辑器强制要求(行不通)
    • 新的风暴(决定放弃strcpy)
  • 第二次挣扎(使用strcpy_s)
    • 风暴又一次来临(提示越界)
    • 风暴叒一次来临(正确的道路)
    • 风暴叕一次来临(收尾工作)

发现错误

软件:Visual Studio 2017

题目

C++程序设计(第3版)谭浩强,第六章习题第2题:输入3个字符串,按由小到大的顺序输出(要求用指针或引用方法处理)

报错的代码

参考C++程序设计题解与上机指导(第3版)谭浩强著
C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第1张图片
C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第2张图片

第一次挣扎(不改变strcpy)

避免编辑器强制要求(行不通)

开头添加#define _CRT_SECURE_NO_WARNING
参考C++中strcpy() 函数报错

新的风暴(决定放弃strcpy)

C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第3张图片
C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第4张图片

第二次挣扎(使用strcpy_s)

风暴又一次来临(提示越界)

C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第5张图片
C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第6张图片
参考浅谈 Run-Time Check Failure #2 - Stack around the variable ‘xxx’ was corrupted 的解决方法后意识到是在程序中的某个变量附近的内存被破坏了,这表示程序存在内存越界,通过排查也认识到是p出了问题,作为菜菜的初学者,我自认为机智地修改了p数组的大小
C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第7张图片
C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第8张图片
C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第9张图片
真好,无论是将20改为100,23还是50都是错的,表面笑嘻嘻,心里哭唧唧。不过,失败是成功之母嘛,决定找strcpy_s示例看看的我又打开了搜索网站

风暴叒一次来临(正确的道路)

感谢strcpy_s函数,我找到了一种新的分配存储空间的方式

#include 
#include 
using namespace std;

void swap(char *p1, char *p2) {
	char *p = new char[21];
	strcpy_s(p, strlen(p) + 1, p1);
	strcpy_s(p1,strlen(p1)+1,p2);
	strcpy_s(p2, strlen(p2) + 1, p);
}

int main() {
	char str1[20],str2[20],str3[20];
	cout << "请输入三个字符串:" << endl;
	gets_s(str1);
	gets_s(str2);
	gets_s(str3);
	if (strcmp(str1, str2) > 0) {
		swap(str1, str2);
	}
	if (strcmp(str1, str3) > 0) {
		swap(str1, str3);
	}
	if (strcmp(str2, str3) > 0) {
		swap(str2, str3);
	}
	cout<< "交换后的顺序为:" << endl;
	cout << str1 << endl << str2 << endl << str3 << endl;
	return 0;
}

这下总不能再有问题了趴><

风暴叕一次来临(收尾工作)

我是万万没想到C++会偷袭我这个18岁的小姑凉
特喵地叕有新的问题(文章写于问题解决之后,实在不想重新安装一次VS2017截报错图了,问题描述如下)
在编译的过程中出现了一个对话框提示程序已经出现一个断点,然后跳转界面提示未加载 wntdll.pdb
参考vs编译出现未加载 wntdll.pdb

step1:点击调试中的选项
C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第10张图片
step2:右侧找到符号再在Microsoft符号服务器前点击打勾
C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第11张图片
等比较长的一段时间(我等了近二十分钟)之后就可以啦~

虽然还是会触发断点
C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第12张图片
但是能够运行出结果

C++输入3个字符串,按由小到大的顺序输出(用指针方法处理),VS2017strcpy使用与strcpy_s使用_第13张图片

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号