c++编程之谜
C++ Possible Programming Mystery?
#include <iostream>
using namespace std;
int main()
{
int loop = 0;
int Pass = 0;
int guess = 0;
cout << "Write In A 4 Digit Number!";
cin >> Pass;
while (loop == 0)
{
guess = guess + 1;
if (Pass == guess)
{
cout << "Your number is" + guess;
}
}
return 0;
}
这个神秘的代码给我随机输出。这是一个猜测你输入的数字的程序。相反,当你输入一个随机数并回车时它会给你error和YF之类的东西。通过测试代码,您可以自己尝试一下。如果你输入1并按回车键,你会得到我们的号码打印出来。
- 我们的号码是
- 你的号码是
- r号为
- 是
- 是
还有一些更奇怪的,比如如果你输入666,你会得到:e:: _s_normalize_category category未找到,如果你输入333,将打印出来。
还有很多。有些数字是空白的,有些不是。
谁能告诉我为什么会这样?谢谢你帮我解决这个问题。我现在把它关上。你还可以聊天!你需要改变
cout << "Your number is" + guess;
cout << "Your number is " << guess;
在c++中,向字符串字面值添加数字不会将数字转换为字符串;它完全做别的事情(指针算术)。
有关C和c++中指针运算的背景知识,请参见C中指针的所有知识(特别是关于字符串的最后一节)。
程序打印出奇怪字符串的原因是,一旦guess
变得足够大,"Your number is" + guess
指向字符串字面量结束后的某个内存,程序打印出该内存中发生的任何内容。(从技术上讲,您处于未定义行为的领域,因此您的程序可以合法地以各种奇怪的方式运行。)
"Your number is"是一个字符*,而你正在给它加上 'guess'。这将指针移动到字符串字面值开头以外的位置。如果guess的值很小,你会在字符串的某个地方结束,它会打印出后面的部分。如果你输入一个更大的数字,它将访问一个完全随机的地方,并导致错误。
试题:
cout << "Your number is: " << guess;
(要使用string +操作符,输入中至少有一部分需要是字符串。你有一个const char *和一个int,所以编译器认为你想做指针算术。即使您将字符串字面值转换为字符串,您也需要使用itoa将guess转换为char *以使其正确显示。使用<<)
通过向字符串的地址("Your number is" + guess
)添加一个整数值,您将获得一个新地址,该地址指向字符串中的某个字符或接下来的内容。然后cout
语句将从那里打印所有字符,直到下一个空字节。
你重新发现了缓冲区溢出攻击的乐趣…
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 模板元编程:如何将参数包组合成新的参数包
- Qt Q串行端口未编程设备未关闭
- 模板元编程 - 尝试实现维度分析
- 我是编程新手
- C++编程从外部文本文件定义数组大小
- 了解算法的性能差异(如果以不同的编程语言实现)
- 使用 Gtkmm 以编程方式选择 Gtk::TextView 中的文本
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)
- 使用命名空间正确编程
- C++编程:运算符重载中的引用如何工作?
- Arduino 模块化编程与全局和设置
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- 如何以编程方式将音频从任何录制设备路由到任何播放设备
- 试图修复一个错误,该错误不会让我开始编程其余部分
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 如何使用可变参数模板类使用模板元编程获得最大值