使用C中的指针查找数组中的最大和最小数字

时间:2016-07-02 21:04:18

标签: c arrays sorting

我正在编写一个程序,当用户将字符串输入命令行时,该程序会查找查找最大的-l或查找最小的-s。例如,./a.out -l 2 4 6将找到最大的用户输入。在我的程序中,我不确定是否应该使用atoi或者我是否可以使用./a.out。我是否能够在程序的第一部分使用a指针,并在下半部分使用实际数组来查找最小或最大的数字?由于-larray[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; } ,我可以跳过这些并仍然找到最大和最小的数字吗?我编写了代码来查找数组中最大和最小的数字,但我不确定它是否兼容。任何帮助将不胜感激。

iconv -f WINDOWS-1250 -t UTF-8 filename.txt > filename.txt

2 个答案:

答案 0 :(得分:1)

是个好主意。

char **argv是指向字符串数组的指针。

当您使用命令行参数运行程序时,argc初始化为传递的参数数量,而argv将指向指向字符串的字符串指针数组,如下所示:

A representation of argv

第一个参数始终是可执行文件的名称,argv的最后一个元素始终接地(设置为NULL)。 有关详细信息,请参阅here

对argv元素使用算术运算实际上会对指向这些字符串的指针进行算术运算,从而导致你很可能不想要的行为。

您必须使用atoi()或编写自己的函数来执行此操作。

答案 1 :(得分:0)

你的论点是:

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

它们都被程序读作“C-strings”,实际上是'\0'个终止的字符数组。因此,char *argv[]是一个指向字符数组数组的指针。有关详细信息,请参阅this SO postthis SO post。运行for循环(在你的情况下是不稳定的,顺便说一句)是没有意义的,以便检测哪个参数是程序选项,如果你知道它是第一个,并且其余代码显示你知道。
如果您确定要遵循的参数是数字,并且您希望比较它们的算术值,则首先必须将它们解释为数字。 atoi()是将returns转换后的整数数字字符串作为int值的函数。您还需要将结果值初始化为给定数据类型的最小值或最大值。我没有看到使用递增指针(*++argv)和while循环来计算main()的参数。使用数组预订和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;
}