c语言中多功能实用程序的问题。
以下程序应该从命令行读取(使用argv[]),并执行以下三个函数之一: right(根据边长决定三角形是否为直角三角形:键入mu-r[sidea][sideb][sidec] findtext:(查找给定文件中字符串的序列:(即“hello”)并列出找到它的行号 计数:(统计制表符、单词和退格的数量) Findtext.c正在正常工作: 例如,如果我键入./mu-f[string][file.txt] 它成功地列出了文件及其所在文件中的行号 但当我使用-r(右)选项运行相同的代码时,它会给我以下分段错误: 项目名称:./mu 3. 分段故障(堆芯转储) 我在这个代码中哪里出错了c语言中多功能实用程序的问题。,c,command-line-arguments,C,Command Line Arguments,以下程序应该从命令行读取(使用argv[]),并执行以下三个函数之一: right(根据边长决定三角形是否为直角三角形:键入mu-r[sidea][sideb][sidec] findtext:(查找给定文件中字符串的序列:(即“hello”)并列出找到它的行号 计数:(统计制表符、单词和退格的数量) Findtext.c正在正常工作: 例如,如果我键入./mu-f[string][file.txt] 它成功地列出了文件及其所在文件中的行号 但当我使用-r(右)选项运行相同的代码时,它会给我以下
#include <stdio.h>
#include <stdlib.h>
//#include "count.h"
//#include "right.h"
//#include "findtext.h"
#define STAND_ALONE 1
void right(int, char **);
void count(int, char **);
void findtext(int, char **);
#ifdef STAND_ALONE
int main(int argc, char *argv[])
{
printf("\n");
printf("Can only use one option(-f, -c, -r) at once. sorry!\n");
printf("\n");
printf("Program name: %s\n", argv[0]);
while ((argc > 1) && (argv[1][0] == '-'))
{
switch (argv[1][1])
{
case 'f': // findtext.c
printf("%s\n",&argv[1][2]);
findtext(argc, argv);
break;
case 'r': // right.c
printf("%s\n",&argv[1][2]);
right(argc, argv);
break;
case 'c': // count.c
printf("%s\n",&argv[1][2]);
count(argc,argv);
break;
default:
printf("Wrong Argument: %s\n", argv[1]);
}
++argv;
--argc;
}
return (0);
}
#endif
void right(int argc, char *argv[]){
int a;
int b;
int c;
int largest;
int a2;
int b2;
int c2;
/*if(argc != 4){
printf("please enter 3 sides, only \n");
} */
a = atoi(argv[2]);
b = atoi(argv[3]);
c = atoi(argv[4]);
//printf("argv2:%s ",argv[2]);
if((a <= 0 )|| (b <= 0) || (c <= 0))
printf("Only positive values allowed\n"); exit(0);
a2 = (a*a);
b2 = (b*b);
c2 = (c*c);
if((c > a) && (c > b))
largest = c;
if((b > a) && (b > c))
largest = b;
if((a > b) && (a > c))
largest = a;
if(largest == a){
printf("HEy hey hey!");
if((b2 + c2) == a2){ printf("%s %s %s is a right triangle\n",argv[2],argv[3],argv[4]); }
else{printf("%s %s %s is not a right triangle\n",argv[3],argv[2],argv[4]);}
}
if(largest == b){
printf("HEy");
if((a2 + c2) == b2){ printf("%s %s %s is a right triangle\n",argv[2],argv[3],argv[4]); }
else{printf("%s %s %s is not a right triangle\n",argv[2],argv[3],argv[4]);}
}
if(largest == c){
printf("yo");
if((a2 + b2) == c2){ printf("%s %s %s is a right triangle\n",argv[2],argv[3],argv[4]); }
else{printf("%s %s %s is not a right triangle\n",argv[2],argv[3],argv[4]);}
}
} /* end method right() */
void findtext(int argc, char *argv[]){
FILE *fin;
char buffer[100];
int counter;
char *ptr = buffer;
char *result;
//if(argc != 3) {printf("Usage: %s filename argc:%d\n", argv[0], argc); exit(1);}
fin = fopen(argv[3], "r");
if(!fin) {printf("Unable to open %s\n", argv[2]); exit(1); }
counter = 0;
while (fgets(buffer, 99, fin)){
counter = counter + 1;
if(strstr(ptr,argv[2])){
printf("%d. %s", counter, ptr);
printf("\n");
}
}
fclose (fin);
}
void count(int argc, char **argv){
FILE *fin;
int lcounter = 0;
int count = 0;
char name[100];
char ch;
int word = 0;
int nchar = 0;
fin = fopen(argv[1],"r"); // open file
if(fin==0){
printf("Could not find specified file.\n");
exit(0);
}
while((ch = getc(fin)) != EOF)
{
nchar++;
if(ch == '\n')
lcounter++;
if(isspace(ch) || ch == '\t' || ch == '\n')
word++;
}
printf("number of characters: %d\n",nchar);
printf("Lines: %d\n",lcounter);
printf("words: %d\n",word);
printf("\n");
fclose(fin);
}
#包括
#包括
//#包括“count.h”
//#包括“right.h”
//#包括“findtext.h”
#定义单机版1
无效权(整数,字符**);
无效计数(整数,字符**);
void findtext(int,char**);
#如果你单独站着
int main(int argc,char*argv[])
{
printf(“\n”);
printf(“一次只能使用一个选项(-f,-c,-r)。对不起!\n”);
printf(“\n”);
printf(“程序名:%s\n”,argv[0]);
而((argc>1)和&(argv[1][0]='-'))
{
开关(argv[1][1])
{
案例“f”://findtext.c
printf(“%s\n”、&argv[1][2]);
findtext(argc、argv);
打破
案例'r'://right.c
printf(“%s\n”、&argv[1][2]);
右(argc,argv);
打破
案例'c'://count.c
printf(“%s\n”、&argv[1][2]);
计数(argc,argv);
打破
违约:
printf(“错误的参数:%s\n”,argv[1]);
}
++argv;
--argc;
}
返回(0);
}
#恩迪夫
无效权限(int argc,char*argv[]){
INTA;
int b;
INTC;
int最大;
int a2;
int b2;
int c2;
/*如果(argc!=4){
printf(“请仅输入三面”\n”);
} */
a=atoi(argv[2]);
b=atoi(argv[3]);
c=atoi(argv[4]);
//printf(“argv2:%s”,argv[2]);
如果((a)&(b>c))
最大=b;
如果((a>b)和&(a>c))
最大=a;
如果(最大==a){
printf(“嘿嘿!”);
如果((b2+c2)==a2){printf(“%s%s%s是一个直角三角形,\n”,argv[2],argv[3],argv[4]);}
else{printf(“%s%s%s不是直角三角形\n”、argv[3]、argv[2]、argv[4]);}
}
如果(最大==b){
printf(“嘿”);
如果((a2+c2)==b2){printf(“%s%s%s是一个直角三角形,\n”,argv[2],argv[3],argv[4]);}
else{printf(“%s%s%s不是直角三角形\n”、argv[2]、argv[3]、argv[4]);}
}
如果(最大==c){
printf(“yo”);
如果((a2+b2)==c2){printf(“%s%s%s是一个直角三角形,\n”,argv[2],argv[3],argv[4]);}
else{printf(“%s%s%s不是直角三角形\n”、argv[2]、argv[3]、argv[4]);}
}
}/*结束方法右()*/
void findtext(int argc,char*argv[]){
文件*fin;
字符缓冲区[100];
整数计数器;
char*ptr=缓冲区;
字符*结果;
//如果(argc!=3){printf(“用法:%s文件名argc:%d\n”,argv[0],argc);退出(1);}
fin=fopen(argv[3],“r”);
如果(!fin){printf(“无法打开%s\n”,argv[2]);退出(1);}
计数器=0;
而(fgets(缓冲区、99、fin)){
计数器=计数器+1;
if(strstr(ptr,argv[2])){
printf(“%d.%s”,计数器,ptr);
printf(“\n”);
}
}
财务总监(财务);
}
无效计数(整数argc,字符**argv){
文件*fin;
int lcounter=0;
整数计数=0;
字符名[100];
char ch;
int字=0;
int-nchar=0;
fin=fopen(argv[1],“r”);//打开文件
如果(fin==0){
printf(“找不到指定的文件。\n”);
出口(0);
}
而((ch=getc(fin))!=EOF)
{
nchar++;
如果(ch='\n')
lcounter++;
if(isspace(ch)| | ch='\t'| | ch='\n')
word++;
}
printf(“字符数:%d\n”,nchar);
printf(“行:%d\n”,l计数器);
printf(“单词:%d\n”,单词);
printf(“\n”);
财务总监(财务);
}
#包括
,#包括
chars
,而不知道它的长度足以包含这些字符。while((argc>1)和(&&&(argv[1][0]='-')
printf(“%s\n”、&argv[1][2]);
应该只打印一个换行符作为argv[1]
is“-r”right()
中,在不知道存在5个参数的情况下执行c=atoi(argv[4]);
++argv;
--argc;
。我真的不认为这些将满足您的需要5.您正在崩溃,因为您正在尝试递增
argv
,它是一个数组变量,而不是指针。因此无法执行argv++
作为一个好的编程原则,(尽管是可选的)argc和argv不应该被触碰;如果您想运行它们,应该使用其他变量指向它们
代码中还有许多其他的丑陋之处,它们试图访问指针和地址,而不实际确认它们是否存在
但是,从argv开始,您就需要进行分段故障处理。因此不能替代调试器。请包含准确的错误消息文本。您是否获得了发生错误的行号?我认为GDB是一个非常有用/功能强大的调试器。它只是说分段故障,而没有说它来自哪一行。“它没有说它来自哪一行”——如果你使用正确的标志和工具,它会说的。Domenico,你的权利。我应该在if语句中添加大括号。但是,我希望程序在输入负值时退出。关于a=atoi(argv[2]),我将其设置为con
if((a <= 0 )|| (b <= 0) || (c <= 0))
printf("Only positive values allowed\n"); exit(0);
a = atoi(argv[2]);
b = atoi(argv[3]);
c = atoi(argv[4]);