我正在尝试编写一个程序,以查找 10 个数字中最大和最小的一个。
要使用我的程序,您必须使用命令行参数 -l 然后使用 numbers 来确定最大数字,命令 -s 用于最小数字也是如此。
但是,当我根本不输入命令,只是尝试运行程序时,我会收到分段错误。不知道我哪里出错了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
int i;
int min,max,num;
char *argv1 = argv[1];
char *small = "-s";
char *large = "-l";
min=max=0;
if (0==strcmp(argv1, small))
{
for (i=2; i<argc; i++)
{
num=atoi(argv[i]);
if(i==2)
{
min=num;
}
else
{
if(min>num)min=num;
}
}
printf("The smallest number is %dn",min);
}
else if (0==strcmp(argv1, large))
{
for (i=2; i<argc; i++)
{
num=atoi(argv[i]);
if(i==2)
{
max=num;
}
else
{
if(max<num)max=num;
}
}
printf("The largest number is %dn",max);
}
else
{
printf("Invalid option");
}
return 0;
}
在访问参数之前检查参数的数量。
int main(int argc, char* argv[])
{
int i;
int min,max,num;
char *argv1 = argv[1];
char *small = "-s";
char *large = "-l";
/* add from here */
if(argc < 2)
{
fprintf(stderr, "Usage: %s command numbers...n", argc > 0 ? argv[0] : "");
return 1;
}
/* add until here */
min=max=0;
您设置char *argv1 = argv[1];
时没有先检查argc
以查看传递了多少参数。当您稍后执行if (0==strcmp(argv1, small))
时,这将导致段错误,因为argv1
不会像您期望的那样指向字符串。
要修复它,只需在开始将argv1
与任何内容进行比较之前检查argc
:
if (argc == 1)
{
printf("Error: -s or -l requiredn");
exit(1);
}