檢查我試圖成功地解析在命令行上給出C.給定的輸入會是這個樣子的論點整數:命令行參數整數錯誤使用C
a.out 2
很簡單。但是我無法弄清楚如何對此進行錯誤檢查。例如,每個下面的運行應引發錯誤:
a.out 2hi
a.out 9hello
a.out 4x
錯誤處理我已經實現捕獲的任何非整數的字符在整數本身(例如「> a.out的HI4」)的前面,因爲我使用sscanf。 Atoi()和strtol()不起作用,因爲它們只是從參數前面解析整數值。任何幫助將不勝感激!
檢查我試圖成功地解析在命令行上給出C.給定的輸入會是這個樣子的論點整數:命令行參數整數錯誤使用C
a.out 2
很簡單。但是我無法弄清楚如何對此進行錯誤檢查。例如,每個下面的運行應引發錯誤:
a.out 2hi
a.out 9hello
a.out 4x
錯誤處理我已經實現捕獲的任何非整數的字符在整數本身(例如「> a.out的HI4」)的前面,因爲我使用sscanf。 Atoi()和strtol()不起作用,因爲它們只是從參數前面解析整數值。任何幫助將不勝感激!
使用strtol()
,並檢查一下它轉換到底是字符串的結尾:
char *end;
errno = 0;
long l = strtol(argv[1], &end, 10); // 0 if you want octal/hex/decimal
if (end == argv[i] || *end != '\0' || ((l == LONG_MIN || l == LONG_MAX) && errno == ERANGE))
…report problems…
…either use l as a long, or check that it is in the range INT_MIN..INT_MAX
這會悄悄地跳過前導空白。如果這是一個問題,您可以檢查對他們來說太:
if (!isdigit((unsigned char)argv[i]) && argv[i] != '+' && argv[i] != '-')
…first character isn't part of a decimal number…
參見:
int is_integer(char *str)
{
if(!str)
return 0;
int len = 0, pmflag = 0;
while(*str != '\0') // if you sure about null-termination
{
if(*str == '-' || *str == '+')
{
if(len)
return 0;
pmflag = 1;
}
else if(*str < '0' || *str > '9')
{
return 0;
}
len++;
str++;
}
if(pmflag && len == 1)
return 0;
return 1;
}
只是循環你的論點和波紋管,如果你遇到一個非數字然後。你還能要求什麼呢?順便說一句:'scanf()'在數字之前允許空格。 – Deduplicator