массивы — собственный strncpy () переполнение стека

Я пытаюсь реализовать свою собственную версию strncpy (), я нашел исходный код из этого ссылка на сайт.

Но я столкнулся с Unhandled exception at 0x00411ad5 in exercise 2.exe: 0xC0000005: Access violation writing location 0x00417800. каждый раз, когда код достигает этого кода while((x++ < n) && (*dest++ = *source++));

Вот полный код:

char *strncpy(char * destination, const char * source, size_t n){
char *dest;
dest = destination;

size_t x=0;
while((x++ < n) && (*dest++  = *source++)); //this is where unhandled exception occurs
while(x++ < n){
*dest++ = 0;
}

return dest;
}

int main(){
char *sample = "blue";
char * sample2 = "red";

cout << strncpy(sample, sample2, 5);
getch();
return 0;
}

Скажите пожалуйста, почему это происходит и как мне это исправить? Спасибо!

-1

Решение

Ваш пункт назначения "blue" который является строковым литералом, это константа. Как таковой, он находится в доступной только для чтения части памяти (и на нее указывает локальный sample переменная), таким образом ошибка при записи.

Попробуй это:

int main(){
char sample[] = "blue";
char * sample2 = "red";

cout << strncpy(sample, sample2, 5);
getch();
return 0;
}

что делает sample массив в локальной, доступной для записи памяти.

2

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

Вы не можете записать в строковую константу (sample); написать в char вместо массива:

int main(){
char *sample = "blue";
char buffer[5];

cout << strncpy(buffer, sample, sizeof(buffer));
getch();
return 0;
}
2

Во-первых, вам уже объяснили, что вы не можете перезаписать строку, определенную таким образом.
Во-вторых, вы не можете использовать Cout << strncpy, если эта функция возвращает указатель на конец скопированной строки.

2

Есть две основные проблемы с вашей программой
Первая — это функция strncpy должен вернуться destination вместо dest

char *strncpy(char * destination, const char * source, size_t n){
char *dest;
dest = destination;

size_t x=0;
while((x++ < n) && (*dest++  = *source++)); //this is where unhandled exception occurs
while(x++ < n){
*dest++ = 0;
}

//        return dest;
return destination;
}

Второе — строковые литералы неизменны. Любая попытка изменить строковый литерал приводит к неопределенному поведению.

Таким образом, основная функция должна быть переписана следующим образом

int main(){
char sample[] = "blue";
char * sample2 = "red";

cout << strncpy(sample, sample2, sizeof( sample ) );

getch();

return 0;
}

Также это плохой стиль программирования — использовать переменную с именем x в счет. Лучше использовать например i,

Я бы написал функцию проще

char * strncpy( char *destination, const char *source, size_t n )
{
char *dest = destination;

while ( n-- && ( *dest++  = *source++ ) );
while ( n-- ) *dest++ = '\0';

return destination;
}
1
По вопросам рекламы [email protected]