`
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
// function prototypes
int get_key(int argc, char *argk[]);
int main(int argc, char *argv[]){
char *argv1 = argv[1];
get_key(argc, argv1);
return 0;
}
// function defination.
int get_key(int argc, char *argk){
// ensure single cmd line arg
if(argc < 2 || argc > 2){
printf("usage: ./caesar key(int) !\n");
return 1;
}
char str1[] = "2";
char str2[] = "23";
char str3[] = "a23";
char str4[] = "23b";
char str5[] = "a23b";
int len = strlen(str3);
int number;
for(int i = 0; i < len; i ){
if(isdigit(str3[i])){ // since isdigit() accept only char, not char*.
number = atoi(str3); // meaning if str3 did contain digits 0-9 from ascii chart.
}
}
return number;
}
`
大家好,我想在不信任用戶的情況下將 argv[1] 轉換為整數。因為 isdigit() 只接受 char,而不接受 char*,這就是為什么我要遍歷 str3 而 atoi 接受 char*。它適用于 str1 和 str2。但對于其他字串變數,它回傳其中的數字,無法使用 atoi() 或任何其他計算進行轉換。如果任何 argv[1] 元素包含來自 ascii 圖表的非數字 0-9,我想報告錯誤訊息。謝謝。
uj5u.com熱心網友回復:
由于您說用戶輸入不可信,因此我不建議使用該功能atoi,原因有兩個:
如果轉換后的數字不能表示為
int(即,如果數字超出范圍),則行為未定義。該函式將
0在轉換失敗時回傳。但是,發生這種情況時,您將不知道用戶是否實際輸入,0或者您是否由于轉換失敗而獲得了該值。
如果您使用 functonstrtol而不是atoi.
在您的問題中,您宣告如果輸入包含任何非數字字符,您想拒絕該輸入。該函式的一個問題strtol是它會在嘗試轉換數字之前跳過任何前導空白字符(例如空格和制表符)。如果您想要拒絕包含任何前導空白字符的輸入,那么您必須isdigit在使用函式之前將每個字符與 ,進行比較strtol。這樣做也可以解決數字后無效字符的問題,這樣輸入123abc就會被拒絕。
這是一個程式,它將嘗試轉換argv[1]為整數,同時執行完整的輸入驗證:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
int main( int argc, char *argv[] )
{
long num;
char *p;
//verify that argv[1] is valid
if ( argc < 2 )
{
printf( "not enough parameters!\n" );
exit( EXIT_FAILURE );
}
//verify that argv[1] consists only of digits
for ( p = argv[1]; *p != '\0'; p )
{
if ( !isdigit( (unsigned char)*p ) )
{
printf( "first program argument must consist only of digits!\n" );
exit( EXIT_FAILURE );
}
}
//attempt to convert argv[1] to integer
errno = 0;
num = strtol( argv[1], &p, 10 );
//verify that conversion was successful
if ( p == argv[1] )
{
printf( "unable to convert to integer\n" );
exit( EXIT_FAILURE );
}
//verify that no range error occurred
if ( errno == ERANGE )
{
printf( "input is out of range\n" );
exit( EXIT_FAILURE );
}
//everything is ok, so print the result
printf( "The result is: %ld\n", num );
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416413.html
標籤:
