strcpy не работает с массивами одинакового размера

Когда я пытаюсь присвоить значение одной строки другой, используя 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 или более, программа будет работать хорошо.
В чем здесь проблема?

1

Решение

strcpy работает с нулевыми концами строк. У ваших массивов символов нет завершающих нулевых байтов.

Если это работает, когда вы объявляете массивы как [6] это просто случайно.

7

Другие решения

функция strcpy(); ожидает нуль \0 завершенная строка. str[] не нуль \0 прекращается.

Поскольку в вашем коде вы печатаете массив char на char, вы можете исправить код в соответствии с предложением @Каролий хорват используя memcpy вместо strcpy.

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

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

Весьма рискованно использовать строковые операции без формирования строк с нулевым символом в конце.

Здесь 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);
3
По вопросам рекламы [email protected]