error: expression is not assignable (to part of C pointer)

error: expression is not assignable (to part of C pointer)

我收到这个错误:

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] = '[=11=]';
            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 还比较陌生)

在此声明中

*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'){

而这个循环即使你会使用标准的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 的开头放置了一个表示表达式 strlen( fullmsg ) 值的字符串(以零结尾)。您需要一个大小为 11 字节的单独字符串,用于调用 sprintf 将值转换为字符串,然后您可以使用函数 memcpy 将此字符串复制到fullmsg 指向的字符串。