Cout 一个字符串可以打印任何内容到屏幕上

cout a string aint printing anything to the screen

本文关键字:任何内 打印 屏幕 字符串 一个 Cout      更新时间:2023-10-16

这是一个简单的字符串操作问题。将字符串中的每个字符向右移动 2 个位置。

我使用第二个字符串将字符从第一个字符串复制到第二个字符串中的所需位置。但是 cout 不会打印第二个字符串。如果我尝试像注释中那样打印字符串,它可以工作。 为什么cout<<dups不起作用?

#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
string dups;
cin>>s;
int k;
cin>>k;
for(int i=0;s[i];i++)
{
int idk = (i+k)%6;
dups[idk] = s[i];
}
dups[6] = '';
cout<<dups;

/*for(int i=0;dups[i];i++)
cout<<dups[i]; */
}

输入:黑客 2 输出:厄哈克

首先,没有打印任何东西。 如果我喜欢评论,它可以工作。

你到处都有未定义的行为,因为你默认初始化了你的字符串(零大小(和越界访问:

string dups;

一种解决方法是

string s;
cin>>s;
string dups = s;

如果我喜欢评论,它可以工作。

执行此操作时,您可能已成功写入某个内存位置:

string dups;              // dups.size() == 0 after this
...
dups[idk] = s[i];     // You write to memory you don't "own".

在提取数据时,您可以像这样检索相同的数据:

for(int i=0;dups[i];i++)  
cout<<dups[i];        // dups.size() is still 0

但它只是看起来有效。您写入的内存可能会被几乎任何东西覆盖,因此您不能指望它为您提供正确的结果。程序的行为是未定义的。任何事情都可能发生。

您可以通过调整大小来修复它,当您知道它需要包含多少个字符时dups

cin>>s;
dups.resize(s.size());