Я пытаюсь реализовать свою собственную версию 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;
}
Скажите пожалуйста, почему это происходит и как мне это исправить? Спасибо!
Ваш пункт назначения "blue"
который является строковым литералом, это константа. Как таковой, он находится в доступной только для чтения части памяти (и на нее указывает локальный sample
переменная), таким образом ошибка при записи.
Попробуй это:
int main(){
char sample[] = "blue";
char * sample2 = "red";
cout << strncpy(sample, sample2, 5);
getch();
return 0;
}
что делает sample
массив в локальной, доступной для записи памяти.
Вы не можете записать в строковую константу (sample
); написать в char
вместо массива:
int main(){
char *sample = "blue";
char buffer[5];
cout << strncpy(buffer, sample, sizeof(buffer));
getch();
return 0;
}
Во-первых, вам уже объяснили, что вы не можете перезаписать строку, определенную таким образом.
Во-вторых, вы не можете использовать Cout << strncpy, если эта функция возвращает указатель на конец скопированной строки.
Есть две основные проблемы с вашей программой
Первая — это функция 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;
}