cout字符串不会在屏幕上打印任何内容

时间:2019-09-12 18:05:50

标签: c++ string

这是一个简单的字符串操作问题。将字符串中的每个字符右移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] = '\0';
      cout<<dups;


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

输入:黑客        2 输出:erhack

第一个指令没有打印任何内容。 如果我喜欢在评论中使用它,就可以了。

2 个答案:

答案 0 :(得分:2)

您到处都有undeined behavior,因为您默认初始化了字符串(零大小)并超出了范围:

string dups;

一个解决方法是

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

答案 1 :(得分:0)

  

如果我喜欢它的评论,那么它会起作用。

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

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());