gpt4 book ai didi

Collat​​z 和带空格的打印

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

我有以下代码:

#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"和其他一些格式化“东西”。当您运行该程序时,如果您输入 8,我希望输出为:8 4 2 1而是得到 8421 .也就是说,当我们输入一个像 19 这样的数字时,我们会得到一个非常长的数字,它是“正确的”但格式不正确。请给我一些格式化帮助!

此外,我的算法似乎可能不正确 - 如果您使用 3,您应该期待结果:3, 10, 5, 16, 8, 4, 2, 1我得到 31518421

最佳答案

您可以简单地使用:

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);

在这里,您将 writer 移动实际写入的字符数,这将防止被下一次调用 sprintf 覆盖。

关于Collat​​z 和带空格的打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46209232/

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