2012-03-07 105 views
0

我假設我正在使用這種錯誤的方式,但想法是命令行參數是我的fibonnaci serquence的長度...但是我這樣做的方式,9我搞砸了......我該如何解決這個問題?C命令行參數問題

#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

這功課嗎?如果是這樣,你應該添加「家庭作業」標籤。 – Perry 2012-03-07 01:02:01

回答

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

這會減少錯誤報告爲每條錯誤一行,這比四行更好。 (我的完整的系統是比這更復雜,完全出自保證金—一切開,它就會告訴程序名和報告,它會自動但是,這是一個可行的起點。)

+0

謝謝先生!也感謝您的額外信息;)幫助了很多。 – 2012-03-07 01:52:00

0

嘗試使用功能atoi

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 */ 
0

得到的說法是這樣的:

int num = atoi(argv[1]); 
1

您的方式可以擴展到處理多個數字,但我認爲您真正需要的是atoi()或未棄用的strtol()