gpt4 book ai didi

c++ - 为什么这个 C++ 程序的输出会在 cmd 中产生一个巨大的困惑?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:51 25 4
gpt4 key购买 nike

从那以后我想出了如何使这个程序正确,但我只是想知道为什么这个错误的程序会产生一大堆字符和不同的机器信息,如果这样的错误会损坏机器:

Exercise 3.10: Write a program that reads a string of characters including punctuation and writes what was read but with the punctuation removed.

#include <iostream>
#include <string>
using std::string;
using std::cin;
using std::cout;
using std::endl;


int main()
{
string s("Some! string!s.");

for (decltype(s.size()) index = 0;
index != s.size(); ++index){
if (!ispunct(s[index])){
cout << s[index];
++index;
}
else {
++index;
}
}

return 0;
}

现在,我知道它是不正确的,并且已经使这个版本能够正确输出所需的内容:

#include <iostream>
#include <string>
using std::string;
using std::cin;
using std::cout;
using std::endl;


int main()
{
string s("Some! string!s.");

for (decltype(s.size()) index = 0;
index != s.size(); ++index){
if (!ispunct(s[index])){
cout << s[index];
}
}

return 0;
}

为什么第一个会产生那么乱的代码?另外,当有 if 而没有 else 时,我认为当它到达“空”或不存在的 else 时它就会停止;为什么在第二个程序中,它会成功移动到下一个字符并在遇到空的 else 后重新启动循环?

最佳答案

  • 您的字符串长度为 15 个字符。
  • 错误的代码在每次迭代时将字符索引递增 2,而不是递增 1。
  • 您只是在索引完全等于字符串的长度 (15) 时终止循环,而不是测试越界条件。
  • 当字符索引为14时(对应'.'字符)索引自增16,但字符串长度为15,如16 != 15 循环继续,读取字符串末尾未定义的内存并将其写入输出流。

关于c++ - 为什么这个 C++ 程序的输出会在 cmd 中产生一个巨大的困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29547639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com