Вопрос

Я пытаюсь реализовать

void strcpyy(char *s, char *t){
    while(*s++ = *t++){
    }
}

это пример от K&R.Реализация должна быть довольно простой, но по какой-то причине сейчас для меня это не так.Итак, у меня есть следующее

int main(){
    char *mess = "hello world";
    char *mess = (char *) malloc(strlen(mess) + 1);
    char *aess;

    strcpyy(aess, mess);

    printf("%s", aess);

    return 0;
}

Каждый раз, когда я запускаю программу, я получаю большой список ошибок каждый раз, когда запускаю программу. -Wall.Я думаю, что для реализации и использования strcpyy, вам придется освободить пространство malloc, чтобы скопировать строку, и как только вы это сделаете, вы сможете распечатать aess который теоретически должен содержать копию mess.Любая помощь приветствуется!

Это было полезно?

Решение

Всегда полезно обращать внимание на сообщения об ошибках, особенно на первое сообщение (другие часто являются последствиями первой ошибки).В сообщении об ошибке обязательно указан номер строки, соответствующей строке с malloc, и, скорее всего, указано, в чем проблема.

Исправьте свою программу следующим образом:

char *mess = "hello world";
char *aess = (char *) malloc(strlen(mess) + 1);

или полная функция:

int main(){
    char *mess = "hello world";
    char *aess = (char *) malloc(strlen(mess) + 1);

    strcpyy(aess, mess);

    printf("%s", aess);

    return 0;
}

Проблема в том, что ваша линия

char *mess = (char *) malloc(strlen(mess) + 1);

перезаписывает первую строку

char *mess = "hello world";

и линия

char *aess;

оставляет переменную неназначенной.

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

char *mess = "hello world";

и

char *mess = (char *) malloc(strlen(mess) + 1);

которые вводят новую переменную, но с тем же именем.

Другие советы

Программа будет выглядеть следующим образом

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void strcpyy( char *s, const char *t )
{
    while ( *s++ = *t++ );
}

int main( void )
{
    char *t = "hello world";
    char *s = ( char * )malloc( strlen( t ) + 1 );

    strcpyy( s, t );

    printf( "%s\n", s );

    free( s );

    return 0;
}

изменять

char *mess = "hello world";
char *mess = (char *) malloc(strlen(mess) + 1);
char *aess;

к

char *mess = "hello world";
char *aess = malloc(strlen(mess) + 1);

mess — строковый литерал, который хранится в постоянной памяти.вы перезаписывали его и теряли строку, которую хотели скопировать.вам нужно выделить место для места, куда вы хотите скопировать символы, в вашем случае aess переменная.также не забудьте free(aess); в конце вашей программы.в противном случае вы получите утечки памяти.

почему вы заявляете и определяете mess два раза?никогда не объявляйте две переменные с одинаковым именем, если они имеют одинаковую область действия: делая это, вы запутаете компилятор;Я бы рекомендовал использовать strdup так :

int main(){
char *mess = strdup("hello world");
char *aess;

strcpyy(aess, mess);

printf("%s", aess);

return 0;

}

или просто такой простой массив

int main(){

char mess[] = "hello world";
char *aess;

strcpyy(aess, mess);

printf("%s", aess);

return 0;

}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top