Collat​​z和打印空间

时间:2017-09-14 01:45:57

标签: c

我有以下代码:

#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

1 个答案:

答案 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时被覆盖。