【问题标题】:Random junk when copying array复制数组时出现随机垃圾
【发布时间】:2020-04-20 06:33:30
【问题描述】:

当我运行这个程序时,它运行良好,但由于某种原因,我在输出中随机出现垃圾。如果我输入一个大于 11 个字符的字符串,我将开始得到随机垃圾,如果我输入少于 11 个字符,则随机垃圾不会出现并且看起来很好......

这是错误的图片

#include <iostream>

using namespace std ;

int main ()
{
    //Declare and initialize variables
    char str1 [100], str2 [100] ;
    int i, y ;

    //Top display
    cout << endl
    << "Copy one string to a second string\n"
    << "----------------------------------\n" ;

    //Read user input
    cout << "Please enter a string: " ;
    cin.getline (str1 , sizeof (str1) ) ;
    cout << endl ;

    //Make copy using strcpy
    for ( i = 0 ; str1[i] != '\0'; i ++ )
    {
        str2[i] = str1[i] ;
        cout << i << "  " ;
    }


    y = sizeof (str2) ;

    //Display results
    cout << endl
    << "Str1: " << str1 << " has been copied into str2: " << str2 << endl
    << "y: " << y << endl ;


    return 0 ;
}

【问题讨论】:

  • Seems to work 给我。你期望什么结果,你观察到什么结果。
  • @IgorTandetnik link 这是错误的图片。当我输入 12 个或以上字符时,它会给出随机垃圾。但在 11 个字符及以下没有垃圾。
  • 你应该以空结尾的 c 样式字符串。 str1[i] != '\0'str2 获得终止符之前停止复制。
  • 阻力最小的路径是在循环之后添加str2[i] = '\0';
  • @user4581301 sizeof 返回分配给数组的元素数,而 strlen 返回我相信的字符串的字符长度。我只是在其中添加了那些随机计算来帮助我找出我做错了什么。

标签: c++ arrays null copying


【解决方案1】:

它有效.. 尝试在for 块的末尾和y=sizeof 之间添加以下内容以帮助调试

str2[i] = 0;
cout<<"\nstr2 is "<<i<<" characters:  ==" << str2 <<"==" << " \n" ;

更清楚的是getline (cin,str1);

【讨论】:

  • getline (cin,str1); 不太清楚,这里不会编译。如果 str1std::string,而不是 char 数组,这将起作用
【解决方案2】:

只需声明两个字符串,您就可以用更少的代码解决这个问题。然后将字符串 2 设置为字符串 1。

#include <iostream>
using namespace std;

string str1;
string str2;

int main() {
    cout << "String 1 is now :\t" << str1 << endl;
    cout << "String 2 is now :\t" << str2 << endl;
    cout << "Enter a String" << endl;
    getline(cin, str1);
    str2 = str1;
    cout << "String 1 has been copied into string 2" << endl;
    cout << "String 1 is now :\t" << str1 << endl;
    cout << "String 2 is now :\t" << str2 << endl;
    return 0;
}

【讨论】:

    【解决方案3】:

    你不要空终止新的字符串。在你的循环之后这样的事情就可以解决问题:

    // null terminate the string
    if(i < 100) {
        str2[i] = 0;
    } else {
        // terminate the last character anyway
        str2[99] = 0;
    }
    

    这有硬编码的值。我可能会改变它。

    这不一定是空终止字符串的最佳方法。但至少你知道现在发生了什么。


    另外,sizeof 是一个编译时间常数,表示数组的大小。我猜这不是你想要的,而是你想要strlen()strlen() 给出了字符串的长度。

    y = strlen(str2);
    

    但我想这是我的猜测。

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      相关资源
      最近更新 更多