簡體   English   中英

使用C中的指針查找數組中的最大和最小數字

[英]Find largest and smallest number in array using pointers in C

我正在編寫一個程序,該程序查找當用戶在命令行中輸入字符串時是否出現-l表示最大查找或-s表示最小查找。 例如,./ ./a.out -l 2 4 6將找到最大的用戶輸入。 在我的程序中,我不確定是否應該使用atoi或是否可以擺脫atoi 我還能在程序的第一部分使用指針,並在下半部分使用實際數組查找最小或最大數字嗎? 由於./a.out-l存儲在array[0]array [1]中,我可以跳過這些並仍然找到最大和最小的數字嗎? 我已經寫了代碼來查找數組中最大和最小的數字,但是我不確定它是否兼容。 任何幫助,將不勝感激。

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

int main(int argc, char *argv[]){

  int x,i;

  for(; *argv != '\0'; argv++){ //checks to see if -l is in string
    if (strcmp(*argv,"-l") == 0){
      x = 1;  //easier to use x value than nested fors and ifs
      break;
  }
    if(strcmp(*argv,"-s") == 0){ //checks if -s is in string
      x = 2;
      break; 
  } 
    else{  //if neither 
     printf("Error invalid option");
     break;
  }
}

  if(x == 1){ //is going to find the largest element
   for(i=2;i<argc;++i){
       if(argv[2]<argv[i]) 
           argv[2]=argv[i];
  }
   printf("Largest element is %d", argv[2]); 
}

  if( x == 2){ //find smallest element 
    for(i=2;i<argc;++i){
           if(argv[2]>argv[i]) 
               argv[2]=argv[i];
  }
    printf("Smallest element is %d", argv[2]); 
}
  return 0;
}

不是一個好主意。

char **argv是指向字符串數組的指針。

當使用命令行參數運行程序時,argc初始化為傳遞的參數數量,而argv將指向指向字符串的字符串指針數組,如下所示:

argv的表示形式

第一個參數始終是可執行文件的名稱,而argv的最后一個元素始終是接地的(設置為NULL )。 有關更多信息,請參見此處

在argv的元素上使用算術運算實際上將對指向那些字符串的指針進行算術運算,從而導致您很可能不希望出現的行為。

您必須退回使用atoi()或編寫自己的函數來這樣做。

您的一組參數是:

argv[0] "program_name"
argv[1] "-l" (or "-s")  [program options]
argv[2] "<first_number>"
… 
argv[argc-1] "<last_number>"
NULL

它們全部被程序讀取為“ C字符串”,實際上是'\\0'終止的字符數組。 因此, char *argv[]是指向字符數組的指針。 有關更多信息,請參見此SO帖子此SO帖子 如果您知道第一個參數,則運行for循環(對於您來說是不穩定的情況)是沒有意義的,以檢測哪個參數是程序選項,而其余代碼則表明您知道。
如果您確定后面的參數是數字,並且要比較它們的算術值 ,則首先必須將它們解釋為數字。 atoi()是用於轉換后的整數字符串作為int返回的函數。 對於給定的數據類型,您還需要將結果值初始化為最小值或最大值。 我看不出在通過main()參數進行計數時使用增量指針( *++argv )和while循環有太多用處。 使用數組訂閱和for循環更容易閱讀。 這是您的代碼的快速(盡管不完全是傻瓜)修復:

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

int main(int argc, char *argv[])
{
  int x,i,m,n = 0;
  if (strcmp(argv[1],"-l") == 0)
      x = 1;
  else if (strcmp(argv[1],"-s") == 0)
      x = 2;
  else{
     printf("Error: invalid option");
     return(1);
  }

  if(x == 1){ //is going to find the largest element
  m = INT_MIN;  
  for(i=2;i<argc;++i){
      if(atoi(argv[i]) >= m){
          m = atoi(argv[i]);
          n = i;
      }
    }
    printf("Largest is the element #%d, equaling %d\n", n-1, m); 
  }

  if( x == 2){ //find smallest element 
    m = INT_MAX;
    for(i=2;i<argc;++i){
      if(atoi(argv[i]) <= m){
          m = atoi(argv[i]);
          n = i;
      }          
    }
    printf("Smallest is the element #%d, equaling %d\n", n-1, m); 
  }
  return 0;
}

暫無
暫無

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

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