我假设我以错误的方式使用它,但我的想法是命令行参数是我的斐波纳西序列的长度...但是我这样做的方式,9我被搞砸了...我该如何解决这个问题?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* for fork */
#include <sys/types.h> /* for pid_t */
#include <sys/wait.h> /* for wait */
int fibonacci(int n)
{
int first = 0;
int second = 1;
int total, i;
for (i=0;i<n;i++)
{
printf("%d\n", first);
total = first + second;
first = second;
second = total;
}
return 0;
}
int main(int argc, char *argv[])
{
/*Spawn a child to run the program.*/
pid_t pid=fork();
if (pid==0) { /* child process */
if(*argv[1] == 45){
printf("number invalid \n");
}else{
int number = *argv[1] - 48;
fibonacci(number);
}
}
else { /* pid!=0; parent process */
waitpid(pid,0,0); /* wait for child to exit */
}
return 0;
}
答案 0 :(得分:1)
您应该使用strtol
或类似方法解析命令行参数,例如
number = strtol(argv[1],NULL,0);
/* last parameter gives the base, 0 detects hexadecimal (0x) and octal, defaults to 10 */
如果您想跳过错误检查。清理,错误检查:
char *end;
number = strtol(argv[1],end,0);
if (end == argv[1])
{
/* no valid digits */
exit(EXIT_FAILURE);
}
if (*end)
{
/* not all of argv[1] has been consumed
* handle errors
*/
}
/* full parse of argv[1], no problems, carry on */
答案 1 :(得分:1)
您的方式可以扩展到处理多个数字,但我认为您真正需要的是atoi()
或未弃用的strtol()
。
答案 2 :(得分:0)
尝试使用函数atoi
。
答案 3 :(得分:0)
命令行参数是字符串;将字符串转换为整数:
int number = 9;
if (argc > 1)
number = atoi(argv[1]);
这为您提供了一个默认值(9),以及覆盖它的选项。更彻底的检查将拒绝多于1个参数,并且atoi()
:
enum { MAX_FIBONACCI = 47 };
if (argc > 2)
{
fprintf(stderr, "Usage: %s [number]\n", argv[0]);
exit(EXIT_FAILURE);
}
if (argc == 2)
{
number = atoi(argv[1]);
if (number <= 0)
{
fprintf(stderr, "Invalid number %s\n", argv[1]);
exit(EXIT_FAILURE);
}
else if (number > MAX_FIBONACCI)
{
fprintf(stderr, "Number %s is too large (max is %d)\n", argv[1], MAX_FIBONACCI);
exit(1);
}
}
请注意,报告关键信息有助于识别出现了什么问题。在47个条目之后,溢出一个32位有符号整数。
请注意,如果您必须适应任何返回值,那么正确测试strtol()
等错误是一项适度复杂的业务。如果您只需要容纳可以打印斐波那契数字的范围,那就更简单了。
重复的四行错误处理迅速变得令人厌烦。我使用这样的函数代替:
#include <stdarg.h>
void err_exit(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
exit(EXIT_FAILURE);
}
这会将错误报告减少到每个错误一行,这比四行更可取。 (我的完整系统比这更复杂,相当不同 - 除此之外,它会被告知程序名称并自动报告。但这是一个可行的起点。)
答案 4 :(得分:0)
得到这样的论点:
int num = atoi(argv[1]);