添加额外参数时出现带有argv的细分错误

时间:2020-03-06 23:01:05

标签: c segmentation-fault

我有一个代码来测试命令是否与正确的参数一起使用,如果有,则通过调用另一个函数将其附加到文件中。

下面是代码:

void main(int argc, char *argv[]){
        char accnum[10];
        char fname[30];
        char lname[30];
        char date[10];
        int amt;
        FILE *q = fopen("bankdata.csv","r");
        if(!q){
                fprintf(stderr,"Error, unable to locate the data file bankdata.csv");
                exit(100);
        }
        if(argc == 1 ){
                 fprintf(stderr,"Error, incorrect usage!\n");
                 fprintf(stderr,"-a ACCTNUM NAME\n");
                 exit(1);
        }
        if(strcmp(argv[1],"-a") == 0){
                if(argc < 4){
                        fprintf(stderr,"Error, incorrect usage!\n");
                        fprintf(stderr,"-a ACCTNUM NAME\n");
                        exit(1);
                }else if(argc > 3){
                        if((sscanf(argv[2], "%s", accnum ) == 1 ) &&
                           (sscanf(argv[3], "%s", fname ) == 1) &&
                           /*(sscanf(argv[4], "%s", lname ) == 1)*/){ //commented out
                                add(accnum,fname/*,lname*/);
                        }
                }
         }
}
void add(char accnum[], char fname[]/*, char lname[]*/){
//      printf("%s, %s, %s", accnum, fname, lname);
        size_t line = 0;
        char buf[100] = "";
        char *term = accnum;
        FILE *fp = fopen ("bankdata.csv", "a+");
        while (fgets (buf, 100, fp)) {     /* read each line */
                if (strstr (buf, term)) {       /* test for term  */
                        fprintf(stderr,"Error, account number %s already exists\n", accnum);
                        fclose(fp);
                        exit(50);
                }
                if (strchr (buf, '\n')) line++; /* increment line */
        }
        fprintf(fp,"AC,%s,%s",accnum,fname);
        fclose(fp);
}


所以当我输入

./a.out -a 1111 Joe Blow

它会附加到另一个文件

Ac,1111,Joe

问题是,当我尝试添加姓氏(即uncomment && (sscanf(argv[4], "%s", lname ) == 1)))并使用相同的命令行(./a.out -a 1111 Joe Blow)时,它给我带来了分段错误,而且我不知道为什么。我还尝试取消对add函数中所有相关部分的注释,但是它没有任何改变。

我认为这与argv [4]为空有关,因为这是编写代码时我以前遇到的问题之一,但是argv [4]应该“吹”对吧?

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您可以简化一下。

由于您需要使用固定数量的参数, 首先检查是否足够

if (argc != 5) 
{
  puts("incorrect number of arguments, syntax: {switch} {accountnumber} {firstname} {lastname}");
  return -1;
}

参数数目现在是正确的,请继续使用开关检查开关,但首先要确保开关字符串足够长

if (strlen(argv[2])<2)
{
  puts("switch must be at least two characters long e.g. -a");
  return -2;
}

switch( argv[2][1] )
{
  case 'a':
    add(argv[3],argv[4], argv[5]);  
    break;
  default:
    printf("unrecognized switch %s", argv[2]);
    break;
}  


void add(char* accnum, char* fname, char* lname)
{
  // check arguments for safety
  if (accnum == NULL || fname == NULL || lname == NULL)
  {
    puts("invalid arguments passed to add");
    return;
  }
 ...

也许可以对参数进行更多检查,例如它是否是有效的帐号等等。