我遇到的问题是,例如当用户输入7时,显示屏会显示:
0 11 2 3 5 8 13 21 child ends.
我似乎无法弄清楚如何修复11,为什么它会在序列中显示许多数字!有人可以帮忙吗?
序列号将在命令行中提供。例如,如果提供5,则Fibonacci序列中的前五个数字将由子进程输出。由于父进程和子进程具有自己的数据副本,因此子进程必须输出序列。让父进程调用wait()调用以等待子进程在退出程序之前完成。执行必要的错误检查以确保在命令行上传递非负数。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int a=0, b=1, n=a+b,i,ii;
pid_t pid;
printf("Enter the number of a Fibonacci Sequence:\n");
scanf("%d", &ii);
if (ii < 0)
printf("Please enter a non-negative integer!\n");
else
{
pid = fork();
if (pid == 0)
{
printf("Child is producing the Fibonacci Sequence...\n");
printf("%d %d",a,b);
for (i=0;i<ii;i++)
{
n=a+b;
printf("%d ", n);
a=b;
b=n;
}
printf("Child ends\n");
}
else
{
printf("Parent is waiting for child to complete...\n");
wait(NULL);
printf("Parent ends\n");
}
}
return 0;
}
答案 0 :(得分:13)
11实际上是两个1,它们之间没有空格。第一个来自第二个%d,因为b的值是1:
printf("%d %d",a,b);
第二个来自循环中的第一个printf,其中n = 1:
printf("%d ", n);
答案 1 :(得分:7)
此处没有结束空间
printf("%d %d",a,b);
你第一次遇到麻烦
printf("%d ", n);
您可以做的最优雅的事情是更改循环中的printf
以预先填充所需的空间,如下所示:
printf(" %d", n);
那样你最后不会留下悬空......
您显示“太多”元素,因为您没有计算在第一个printf
中写的那个......
答案 2 :(得分:1)
在我看来,你的程序正确地生成了斐波纳契序列,也许前两个'1'字符看起来像'11',因为它们在屏幕上被压扁了?
答案 3 :(得分:1)
你的代码有一些误导性的表达......
你得到的值是键盘输入,而不是命令行参数... 所以你可以按照以下方式修改它......
main(int argc, char *argv[])
然后你可以获取值并将其存储为整数值...
int num = atoi(argv[1]);
并且您也可以检查用户是否可以使用...
输入值 if(argc < 2)
{
printf("You must enter a value to proceed this operation..\n");
return;
}
如果你在那里输入no 1,它将打印0 1.但答案应该只有0; 所以为了避免这种情况你可以使用两个条件...... if(n == 0) printf(“0”); if(n == 1) printf(“1”); 通过使用以上两个条件你可以避免打印输出11 ....
答案 4 :(得分:1)
写
printf(“%d%d”,a,b);
代替
printf(“%d%d”,a,b);
答案 5 :(得分:0)
取消printf("%d %d"a b);
并让n打印所有值。
首先将第一个变量设置为例如a = 1
,然后设置第二个:b = 0
和第三个c=a+b
。现在首先打印c
而不做任何更改(printf("%d",c);
),然后执行a=b; b=c;
:
for (i=0; i<ii; i++)
{
c=a+b;
printf("%d ", c);
a=b;
b=c;
}
此外,在您的计划中,您已完成n=a+b
两次,这不是必需的。