【问题标题】:error: expression is not assignable (to part of C pointer)错误:表达式不可分配(分配给 C 指针的一部分)
【发布时间】:2020-07-25 06:40:54
【问题描述】:

我收到此错误:

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 相对较新)

【问题讨论】:

    标签: c c-strings memcpy strcpy strlen


    【解决方案1】:

    在此声明中

    *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

    【讨论】:

    • 左边会有一个不可赋值的值不适用于指针的方式。
    • @snr 我不知道什么是“指针方式”。我指出带指针表达式和不带指针表达式的两个语句都是错误的。
    • 嗯,那是我的不足对不起你的英语。
    猜你喜欢
    • 2021-08-04
    • 2017-03-10
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    相关资源
    最近更新 更多