c++编程之谜

C++ Possible Programming Mystery?

本文关键字:编程 c++      更新时间:2023-10-16
#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并按回车键,你会得到我们的号码打印出来。

  1. 我们的号码是
  2. 你的号码是
  3. 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语句将从那里打印所有字符,直到下一个空字节。

你重新发现了缓冲区溢出攻击的乐趣…