簡體   English   中英

在 C 中讀取命令行參數並檢查它是否為數字

[英]Reading command-line argument in C and checking is it a digit

關於我的目標的詳細信息

在 C 中,我的程序應該從命令行獲取輸入,讀取它,確保它是一個數字,然后如果為真則打印出“成功”,如果為假則打印出“用法:./凱撒密鑰”。

預期成績

./caesar 33
Success

或者

./caesar zzz
Usage: ./caesar key

實際結果

./caesar 33
Segmentation error

我試過的

 int main (int argc, string argv[])
 {
   if (argc == 2)
   {
      if (isdigit(argv[1]))
      {
        printf("Success\n");
        return 0;
      }

或者

if (argc == 2)
{
  if (isdigit(argv[0][1]))
  {
    printf("Success\n");
    return 0;
 }

或者

int main (int argc, string argv[])
{
   if (argc == 2 && isdigit(argv[1]))
   {
     printf("Success\n");
     return 0;
   }

你在這里做錯的是你想檢查整個字符串是否由數字組成,但是你將字符串本身傳遞給isdigit ,它需要一個char 您可以做的是手動遍歷char數組並檢查每個char是否為數字,或者您可以使用strspn函數,如下所示。

strspn(argv[1], "0123456789") == strlen(argv[1])

這將比較參數中數字的跨度,如果它與字符串本身的長度相同,則返回 true。 如果您想在參數中允許 + 和 - 符號,請在strspn使用"-+0123456789" ,盡管這會導致+++++情況出現誤報(如下面@dreamcrash 所述),這就是為什么定義自定義函數總是更好的選擇。 strspnstrlen函數都在string.h頭文件中可用。

如果您不需要使用isdigit函數,那么您可以使用 @Param Siddharth 建議的strspn函數。 但是,它們是使用的幾種極端情況

if (strspn(string, "-+0123456789") == strlen(string))

例如,像"-----"這樣的值將被視為有效數字

如果你想使用isdigit函數,那么你需要遍歷String中的所有char (而不是一次性傳遞整個String )並檢查它們中的每一個是否確實是一個數字:

    ...
    int i, is_number = 1;
    for (i = 0; is_number && argv[1][i] != '\0'; i++){
        if(i == 0 && (argv[1][i] == '-' || argv[1][i] == '+')){
           continue;
        }   
        is_number = isdigit(string[i]);
     }
     // It should fail for Strings that are : empty, only "-" or "+"
    if(i == 0 || (i == 1 && !isdigit(argv[1][0])) || !is_number){
        printf("The String is not a Number \n");
        return 1;
     }
     printf("Success\n");
     return 0;
}

我用輸入進行了測試:

  • “-”,不是數字
  • "",不是數字
  • “-1”,數字
  • “+1”,數字
  • “+1+1”不是數字
int main (int argc, string argv[])

C 中未定義string數據類型。第二個參數應為char* argv[]

請查看答案: https : //stackoverflow.com/questions/14709323/does-c-have-a-string-type# :~: text=There%20is%20no%20string%20type,one%20additional%20zero% 20 終止%20個字符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM