Когда я пытаюсь присвоить значение одной строки другой, используя 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 или более, программа будет работать хорошо.
В чем здесь проблема?
strcpy
работает с нулевыми концами строк. У ваших массивов символов нет завершающих нулевых байтов.
Если это работает, когда вы объявляете массивы как [6]
это просто случайно.
функция strcpy();
ожидает нуль \0
завершенная строка. str[]
не нуль \0
прекращается.
Поскольку в вашем коде вы печатаете массив char на char, вы можете исправить код в соответствии с предложением @Каролий хорват используя memcpy вместо strcpy.
void * memcpy (void * destination, const void * source, size_t count);
memcpy(str2, str, sizeof(str));
Весьма рискованно использовать строковые операции без формирования строк с нулевым символом в конце.
Здесь 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);