C父子共享内存,打印时无空格

g6baxovj  于 2023-02-07  发布在  其他
关注(0)|答案(2)|浏览(111)

我目前正在为我的一门课做一个实验,涉及父进程和子进程之间的共享内存。数据由子进程生成,并写入内存。然后父进程打印内存的内容。我的问题是,我似乎无法获得数据点之间的适当间距。用于生成数据的算法Collatz猜想,如果n为偶数,则为n = n/2,如果n是奇数,n = 3 * n +1。所以输入8会生成序列8 4 2 1,但我一直得到"8421"或"8421"或"8421"等。
我尝试过在父对象(printf)和子对象(sprintf)中放置空格的多种组合。

sprintf(ptr, "%d", n); 
sprintf(ptr, "%d ", n); 
sprintf(ptr, " %d", n); 
sprintf(ptr, " %d ", n);

在父代中
x一个一个一个一个x一个一个二个x

y53ybaqx

y53ybaqx1#

问题是如何添加到ptr变量中。将a设置为(char*) &n将使a指向int值,并且由于int值小于256(内存字节),因此它将被读取为1个字符,并以长度1读取。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char *ptr = malloc(4096);
    int n = 12;
    
/// Writting to buffer section ///
    sprintf(ptr, "%d ", n);
    char *a = &n;
    ptr += strlen(a);
//////////////////////////////////
    
    // This should print "" if you added to ptr correctly
    printf("\"%s\"", ptr);
    fflush(stdout);
    
    return 0;
}
output: "2 "

要解决这个问题,你应该使用另一种添加指针的方法。我的建议是用下面的代码替换writing to buffer部分

int write_len = sprintf(ptr, "%d ", n);
    ptr += write_len;

如果您不希望使用spritnf的返回值,也可以执行以下操作:

sprintf(ptr, "%d ", n);
    ptr += strlen(ptr);
bxpogfeg

bxpogfeg2#

注意,您只向ptr添加了数字的长度,而不是整个字符串的长度。
变更:

sprintf(ptr, "%d ",n);
char *a = (char *) &n;
ptr += strlen(a);

致:

char buff[100];
sprintf(buff, "%d ",n);
sprintf(ptr, "%s", buff);
ptr += strlen(buff);

相关问题