【问题标题】:strcpy doesn't work on the same size arraysstrcpy 不适用于相同大小的数组
【发布时间】:2013-09-08 20:02:08
【问题描述】:

当我尝试使用strcpy 将一个字符串的值分配给另一个时,会发生运行时错误。代码下方:

int main (int argc, char **argv)
{ 
  char str[5];
  char str2[5];//if set size of str2 equal to 6, no error occurs

  str[0] = 'a';
  str[1] = 'b';
  str[2] = 'c';
  str[3] = 'd';
  str[4] = 'e';

  cout<<sizeof(str)<<endl;
  cout<<str[0]<<endl;
  cout<<str[1]<<endl;
  cout<<str[2]<<endl;
  cout<<str[3]<<endl;
  cout<<str[4]<<endl;

  strcpy(str2,str);

  cout<<sizeof(str2)<<endl;
  cout<<str2[0]<<endl;
  cout<<str2[1]<<endl;
  cout<<str2[2]<<endl;
  cout<<str2[3]<<endl;
  cout<<str2[4]<<endl;

  getch();
  return 0;
}

错误是:

Run-Time Check Failure #2 - Stack around the variable 'str' was corrupted

如果我将 str2 的大小设置为 6 或更多,程序运行良好。 这里有什么问题?

【问题讨论】:

  • 即使使用 str2[6],str2[7] 也会出错。 Barmar 的答案是正确的。
  • 终止字符串,或者如果它们不是字符串,使用memcpy
  • 你是对的。 strcpy 不适用于数组。你的问题是什么

标签: c++ error-handling strcpy


【解决方案1】:

函数 strcpy(); 需要 nul \0 终止的字符串。 str[] 不是 nul \0 终止。

因为您在代码中逐个字符地打印数组,所以您可以按照@Karoly Horvath 的建议使用 memcpy 而不是 strcpy 来纠正代码。

void * memcpy ( void * destination, const void * source, size_t count );

memcpy(str2, str, sizeof(str));

【讨论】:

  • 我可以做哪些更改以使程序运行良好,但 str 和 str 的大小相同?
  • 终止字符串,如果不是字符串,使用memcpy
  • @NurlanKenzhebekov 抱歉,我还没来得及写回答我的互联网档案。 :(阅读其他答案
  • @KarolyHorvath 不错的建议。
  • @NurlanKenzhebekov 注意你的代码中有未定义的行为
【解决方案2】:

在不形成空终止字符串的情况下使用字符串操作是非常危险的。

在这里,strcpy() 期望将一个空终止的字符串复制到一个也必须为空终止的字符串。

因此你必须使用:

  char str[6];
  char str2[6];

  str[0] = 'a';
  str[1] = 'b';
  str[2] = 'c';
  str[3] = 'd';
  str[4] = 'e';
  str[5] = '\0';
  strcpy(str2,str);

【讨论】:

  • char str[] = "abcde";str 将有 6 个元素,包括终止 \0
【解决方案3】:

strcpy 对以零结尾的字符串进行操作。您的 char 数组没有终止零字节。

如果将数组声明为 [6] 时它正在工作,那只是偶然。

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 2018-11-22
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多