Home > Enterprise >  struct value not being able to enter text
struct value not being able to enter text

Time:10-17

How can I make user enter custom message for the msgbuf.mtext? Whenever I try to change it manually I am getting following error:

struct msgbuf msg
expression must be a modifiable lvalue

What am I doing wrong?

struct msgbuf {
    long mtype;
    char mtext[80];
};

int main() {

    int qid, opt;
    int mode = 0;
    int msgkey = 1234;

    qid = msgget(msgkey, IPC_CREAT | 0666); 
    struct msgbuf msg;
    msg.mtext = "hello";
    msgsnd(qid, (void *) &msg, sizeof(msg.mtext), 0);
    printf("sent: %s\n", msg.mtext);

    return 0;
}

CodePudding user response:

The data member mtext is declared as a character array.

char mtext[80];

Arrays are non-modifiable lvalues. You may not assign one array to another.

For strings you should use for example standard string function strcpy declared in header <string.h>

strcpy( msg.mtext, "hello" );

Or you could initialize the data member mtext in the declaration of the object msg like for example

struct msgbuf msg = { .mtext = "hello" };

If you want to enter a string using scanf you can write

scanf( "ys", msg.mtext );

or

scanf( " ys", msg.mtext );

or

scanf( "y[^\n]", msg.mtext );

or

scanf( " y[^\n]", msg.mtext );

Also in this call

msgsnd(qid, (void *) &msg, sizeof(msg.mtext), 0);

it seems you need to use expression strlen( msg.mtext ) instead of the expression sizeof(msg.mtext). And casting to void * the expression &msg is redundant. A pointer to any object type can be converted to a pointer of the type void *.

Pay attention to that the data member mtype was not initialized.

  • Related