Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中多功能实用程序的问题。_C_Command Line Arguments - Fatal编程技术网

c语言中多功能实用程序的问题。

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(右)选项运行相同的代码时,它会给我以下

以下程序应该从命令行读取(使用argv[]),并执行以下三个函数之一:

right(根据边长决定三角形是否为直角三角形:键入mu-r[sidea][sideb][sidec]

findtext:(查找给定文件中字符串的序列:(即“hello”)并列出找到它的行号

计数:(统计制表符、单词和退格的数量)

Findtext.c正在正常工作:

例如,如果我键入./mu-f[string][file.txt]

它成功地列出了文件及其所在文件中的行号

但当我使用-r(右)选项运行相同的代码时,它会给我以下分段错误:

项目名称:./mu 3. 分段故障(堆芯转储)

我在这个代码中哪里出错了

#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”);
财务总监(财务);
}
  • 见@Domenico De Felice答案

  • 添加
    #包括
    #包括

  • 您正在访问argv[1]中的
    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]);