我有以下代码:
#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char** argv)
{
const char* name = "COLLATZ";
const int SIZE = 4096;
int num = atoi(argv[1]);
int shm_fd;
void *ptr;
shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);
pid_t id = fork();
if (id == 0) {
shm_fd = shm_open(name, O_RDWR, 0666);
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
while (num != 1) {
sprintf(ptr, "%d", num);
ptr++;
if (num % 2 == 0) num /= 2;
else num = 3 * num + 1;
}
sprintf(ptr, "%d", num);
ptr++;
} else {
wait(NULL);
printf("PARENT: %s\n", (char*) ptr);
shm_unlink(name);
}
return 0;
}
我希望它能在正确的数字之间打印空格,但是在添加"%d "
或" %d"
以及其他一些格式设置时,我们无法解决这个问题。东西&#34。当您输入8时,如果您输入8,我希望输出为:8 4 2 1
,而是获得8421
。话虽这么说,当我们输入一个像19这样的数字时,我们会得到一个非常长的数字,这是#34;正确的&#34;但格式不正确。我想要一些格式化帮助!
似乎我的算法可能不正确 - 如果你使用3,你应该期望结果:3, 10, 5, 16, 8, 4, 2, 1
我得到31518421
答案 0 :(得分:3)
您可以简单地使用:
sprintf(ptr, "%d ", num);
这将在您打印的数字后添加一个空格。您可以在printf doc
了解有关printf
格式的更多信息
根据您的错误结果,您可以看到,如果您在3, 10, 5, 16, 8, 4, 2, 1
中获取每个数字的第一个字符,则会获得31518421
。这是因为您在ptr
打印后仅将ptr++;
换了1。因此,如果您打印了两个字符,则第二个字符将在下一步被覆盖。你需要做的是:
int shift = sprintf(ptr, "%d ", num);
ptr = ptr + shift;
或者,以更简洁的形式:
ptr += sprintf(ptr, "%d ", num);
在这里,您可以将编写器移动实际写入的字符数,这将防止下次调用sprintf时被覆盖。