2017-02-08 153 views
-1
#include <stdio.h> 
#include <string.h> 

int convert(char *str) 
{ 
    int i, number = 0; 
    for (i = 0; str[i] != '\0'; ++i) { 
    number = number * 10 + str[i] - '0'; 

    } 
    return number; 
} 

int main(int argc, char *argv[]) 
{ 
    int j; 
    int c = convert(argv[2]); 
    if (argc == 3) { 
    for (j = 0; j < c; j++) { 
     printf("Hello, %s!\n", argv[1]); 
    } 
    } else if (argc < 3) { 
    printf("Not Enough Arguments\n"); 
    } else if (argc > 3) { 
    printf("Too Many Arguments\n"); 
    } 
    return 0; 
} 

給出少於3個參數時出現分段錯誤。 在給出少於3個參數時應該打印「沒有足夠的參數」,但它給出了錯誤分段錯誤。c命令行參數

輸入:./a raju 預期輸出:not enough arguments

+8

在檢查之前使用'argv [2]'是一個壞主意,我想......真的,你不能證明自己的代碼嗎(不是說瘋狂的格式化)嗎? –

回答

2
int c = convert(argv[2]); 

argc時爲2,argv[2]NULL。你期望這行代碼能做什麼,因爲它在程序運行時首先執行?

重構,以便在它下面的條件語句形成對抗條件保護,這裏的東西更接近你可能是打算:

#include <stddef.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int convert(char *str) 
{ 
    int i, number = 0; 
    for (i = 0; str[i] != '\0'; ++i) { 
    number = number * 10 + str[i] - '0'; 
    } 
    return number; 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc != 3) { 
    printf( argc < 3 ? "Not Enough Arguments\n" 
      /*argc > 3*/ : "Too Many Arguments\n" ); 
    exit(EXIT_FAILURE); 
    } 

    int c = convert(argv[2]); 
    for (int j = 0; j < c; j++) { 
    printf("Hello, %s!\n", argv[1]); 
    } 
    return 0; 
} 

附:由於argv[0]通常是程序名稱而不是參數,因此argv[1]argv[2]將作爲您的參數,argv[3]將爲NULL,如果您計算它們,則會計算兩個參數,而不是三個;當給出三個參數時期望argc == 4

0

您可能也有興趣getopt.h library。它處理命令行參數的所有標準功能。