ошибка: выражение не может быть назначено (часть указателя C) - PullRequest
1 голос
/ 12 апреля 2020

Я получаю эту ошибку:

error: expression is not assignable
                                *fullmsg+(fmsglen+10) = output;

за попытку назначить указатель строки на часть другого указателя строки. Почему это происходит и как я могу это исправить? Вот полный код:

int main(){

    int sock = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in server;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(4583);
    server.sin_family = AF_INET;
    connect(sock, (struct sockaddr *) &server, sizeof(server));
    char* fullmsg = (char *) malloc(10010);

    char* command = (char *) malloc(75);
    int commandlen;
    char* output = (char *) malloc (5000);
    int fmsglen = 0;
    while (1){
        recv(sock, command, 75, 0);
        commandlen = strlen(command);
        if (*command == 'c' && *command+1 == 'd'){
            command[commandlen-1] = '\0';
            int stat = chdir(command+3);
            if (stat != 0){
                output = strerror(errno);
                send(sock, output, 5000, 0);
            } else {
                send(sock, 0, 0, 0);
            }
        } else{
            FILE * cmd = popen(command, "r");
            while (fgets(output, 5000, cmd) != NULL){
                *fullmsg+(fmsglen+10) = output;
                fmsglen = strlen(fullmsg);
            }
            sprintf(&fullmsg, "%10lu", strlen(fullmsg));
            send(sock, fullmsg, 10010, 0);
            pclose(cmd);
        }
    }
    free(output);
    free(command);
    free(fullmsg);
    return 0;
}

Вся помощь приветствуется (я знаю, что это, вероятно, ошибка с легким исправлением, но я относительно новичок в C)

1 Ответ

2 голосов
/ 12 апреля 2020

В этом операторе

*fullmsg+(fmsglen+10) = output;

в левой части присваивания используется значение типа int. Вы не можете назначить одно значение другому значению. Кроме того, в правой части находится объект типа char *. Так что в любом случае это назначение не имеет смысла.

Даже если вы перепишете оператор как

fullmsg+(fmsglen+10) = output;

, тем не менее, снова в левой части будет значение, которое может быть не назначаемый.

Кажется, вы имеете в виду что-то вроде следующего

strcpy( fullmsg + fmsglen + 10, output );

То есть вы хотите скопировать строку, указанную указателем output, в массив символов, на который указывает указатель fullmsg с заданным смещением fmsglen + 10.

Также кажется, что вместо этого оператора if

if (*command == 'c' && *command+1 == 'd'){

вы имеете в виду это утверждение

if (*command == 'c' && *( command + 1 ) == 'd'){

И это l oop, даже если вы будете использовать стандартную функцию C strcpy для копирования строки

while (fgets(output, 5000, cmd) != NULL){
    strcpy( fullmsg + fmsglen + 10, output );
    fmsglen = strlen(fullmsg);
}

не правильно, потому что вы можете добавить 10 несколько раз к длине строки результата.

И это утверждение

sprintf(&fullmsg, "%10lu", strlen(fullmsg));

должно быть переписано, по крайней мере, как

sprintf( fullmsg, "%10zu", strlen( fullmsg ) );

Но это также неправильно, потому что вызов помещает в начале fullmsg строку (ноль- прекращено), что представляет значение о f выражение strlen( fullmsg ). Вам нужна отдельная строка размером 11 байтов, которая будет использоваться при вызове sprintf для преобразования значения в строку, а затем вы можете использовать функцию memcpy для копирования этой строки в начало строки, на которую указывает fullmsg.

...