我正在编写一个程序,当用户将字符串输入命令行时,该程序会查找查找最大的-l
或查找最小的-s
。例如,./a.out -l 2 4 6
将找到最大的用户输入。在我的程序中,我不确定是否应该使用atoi
或者我是否可以使用./a.out
。我是否能够在程序的第一部分使用a指针,并在下半部分使用实际数组来查找最小或最大的数字?由于-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;
}
,我可以跳过这些并仍然找到最大和最小的数字吗?我编写了代码来查找数组中最大和最小的数字,但我不确定它是否兼容。任何帮助将不胜感激。
iconv -f WINDOWS-1250 -t UTF-8 filename.txt > filename.txt
答案 0 :(得分:1)
这不是个好主意。
char **argv
是指向字符串数组的指针。
当您使用命令行参数运行程序时,argc初始化为传递的参数数量,而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 post和this 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;
}