gpt4 book ai didi

c++ - 反转输入,输出字符串意外为空

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:38 24 4
gpt4 key购买 nike

#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1;
cin>>s1;

int n=s1.size();
string s2;
for(int a=0;a<n;a++)
{
s2[a]=s1[n-1-a];
}
cout<<s2;
}

但是我没有得到任何输出,但是我可以打印反转字符串的元素。任何人都可以帮忙。

最佳答案

string s2; // no size allocated
for(int a=0;a<n;a++)
{
s2[a]=s1[n-1-a]; // write to somewhere in s2 that doesn't exist yet

您正在写入您从未创建的 s2 元素。这是 Undefined Behaviour ,并且任何事情都可能发生,包括看似正常工作。在这种情况下,您可能会覆盖内存中的某个随机位置。它可能会崩溃,或者该内存可能确实存在但不会立即破坏其他任何东西。您甚至可以稍后再读回它,但它的工作似乎纯属偶然。

您可以通过始终使用 s2.at(a) 来捕获此问题。访问数据,因为它将为您进行范围检查。 ([] 不进行范围检查)。这当然是有代价的,有时人们会在他们确定索引不能越界的情况下跳过它。这是有争议的。在这种情况下,即使您可能确定自己的数学计算正确,它仍然有助于捕获此错误。


您需要预先创建该空间,即通过创建一个充满正确数量的虚拟值的字符串,或者使用 push_back 根据需要为每个元素创建空间。我可能会选择第一个选项:

string s2(s1.size(), '\0'); // fill with the right number of NULs
for(int a=0;a<n;a++)
{
s2.at(a)=s1.at(n-1-a); // overwrite the NULs

您可能想要选择一个不会出现在您的测试数据中的可打印虚拟字符,例如 '#',因为如果您失败了,它会在您打印出来时变得非常明显正确地覆盖一些元素。例如。如果你尝试反转 "abc" 但是当你打印出来时你得到 "cb#" 很明显你有一些 off-by-one error .


第二个选项有点贵,因为随着字符串的增长,它可能需要进行多次分配和复制,但它看起来是这样的:

string s2; // no space allocated yet
for(int a=0;a<n;a++)
{
s2.push_back(s1.at(n-1-a)); // create space on demand

我假设您将此作为学习练习,但我建议您不要编写自己的 reverse,因为语言 provides it in the library .

关于c++ - 反转输入,输出字符串意外为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50481250/

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