gpt4 book ai didi

C - 难以将整个结构写入共享内存

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:06 25 4
gpt4 key购买 nike

我在将结构写入共享内存时遇到问题,因为当我这样做时,代码只写入结构的第一部分。

这是我的数据结构:

struct shmData{
char number[4];
char description[1020];
};

这是我的代码:

//Structure Pointer - placed on SHM
struct shmstruct *ptr;
char description_to_write[1024] = {0};
struct shmData *data_ptr;
data_ptr = (struct shmData*) description_to_write;

//Shared Memory init
create_shm(&ptr);
printf("Started\n");

//Define Offsets
//init_shm(ptr);

//#########################

//Check if number exist
if (!(strcmp("NO SUCH CODE\0", get_description(ptr, 6)))) {
//-> If not, get next offset (nput) where to write new data
// sem_wait(&ptr->mutex);
// long offset = ptr->msgoff[ptr->nput];
// printf("OFFSET: %li\n", offset);
// if (++(ptr->nput) > NMESG)
// ptr->nput = 0; /* circular buffer */
// sem_post(&ptr->mutex);
// printf("Buffer: %s", argv[2]);

snprintf(data_ptr->number, 4, "%s", "6");
snprintf(data_ptr->description, 1020, "%s\n", argv[2]);

printf("DATA: %s\n", data_ptr->number);
printf("DATA: %s\n", data_ptr->description);

printf("description_to_write: %i\n", description_to_write);

//strcpy(&ptr->msgdata[offset], );
//sem_post(&ptr->nstored);
//printf("Wrote...\n\n");
} else {
//-> Else get offset of this number and put data to it
}

这个应该怎么写?在上面的代码中,我试图简单地显示描述数组,但我只得到了数字。

我需要将它写入共享内存,如下所示:

Number(space)(space)(space)Description

共享内存转储看起来像:

00003b0: 3120 2020 496e 7075 7420 4572 726f 720a  1   Input Error.
00003c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00007b0: 3220 2020 4f75 7470 7574 2045 7272 6f72 2 Output Error
00007c0: 0a00 0000 0000 0000 0000 0000 0000 0000 ................
00007d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................

来自调试器:

description_to_write[0] char    54 '6'  
description_to_write[1] char 0 '\000'
description_to_write[2] char 0 '\000'
description_to_write[3] char 0 '\000'
description_to_write[4] char 83 'S'
description_to_write[5] char 111 'o'
description_to_write[6] char 109 'm'
description_to_write[7] char 101 'e'
description_to_write[8] char 84 'T'
description_to_write[9] char 101 'e'
description_to_write[10]char 120 'x'
description_to_write[11]char 116 't'
description_to_write[12]char 10 '\n'

丑陋的解决方案:

int i = 0;
while(i < 4){
if(data_ptr->number[i] == '\000'){
data_ptr->number[i] = 32;
}
i++;
}

最佳答案

传递给 snprintf 的 4 指定要写入的最大字符数。不是写的量。 snprtinf 返回它写入的字符数。所以你只打印 1 个字符,它后面留下 3 个空值。

只是做:

snprintf(data->number,4,"%s    ","6");

这样它将尝试打印后跟 4 个空格的字符串,并打印最多 4 个字符。

关于C - 难以将整个结构写入共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14494479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com