2016-02-07 4 views
0

Это программа, которая используется главным образом для расчета обменного курса. Но проблема здесь в том, что когда я ее компилирую и запускаю, он сказал:Об утверждении и прерывании ловушки 6

Утверждение не выполнено: (argc == 4 || argc == 2), main main, файл test.c, строка 24. Ловушка прерывания: 6

Спасибо !!!!

void convert(int type, double amount, double rate); 

int get_type(char* string); 

void convert(int type, double amount, double rate) { 
    printf("%.2f %s is %.2f %s\n", amount, type == 1 ? "dollars" : "euros", amount * rate, type == 1 ? "euros" : "dollars"); 
} 

int get_type(char* string) { 
    int i, c; 
    for (i = 0, c = string[0]; c != '\0'; c = string[i]) { 
      if (c >= 'A' && c <= 'Z') { 
        string[i] -= 'A' - 'a'; 
      } 
    } 
    return !strcmp(string, "dollar") ? 1 : !strcmp(string, "euro") ? 2 : 0; 
} 

int main(int argc, char** argv) { 
    assert(argc ==4 || argc == 2); 
    if (argc == 4) { 
      int type = get_type(argv[1]); 
      if (type == 0) { 
        printf("%s is an invalid currency type. Use dollar or euro.\n", argv[1]); 
        return 1; 
      } 
      convert(type, atof(argv[2]), atof(argv[3])); 
    } 

    if (argc == 2) { 
      FILE* fd; 
      fd = fopen(argv[1], "r"); 
      if (fd == NULL) { 
        printf("Could not open %s\n", argv[1]); 
        return 1; 
      } 
      char* typestring = (char*)malloc(16 * sizeof(char)); 
      double amount, rate; 
int matches, type; 

      while (!feof(fd)) { 
        matches = fscanf(fd, "%s %lf %lf\n", typestring, &amount, &rate); 
        if (matches != 3) { 
          printf("Line was not formed correctly.\n"); 
          continue; 
        } 
        type = get_type(typestring); 
        if (type == 0) { 
          printf("%s is an invalid currency type. Use dollar or euro.\n", typestring); 
          continue; 
        } 
        convert(type, amount, rate); 
      } 
      free(typestring); 
    } 


    if (argc == 2 && argc != 4) { 
      printf("Usage:\n\tmoney-exchange [dollar|euro type] [double amount] [double rate]\n"); 
      printf("\tmoney-exchange [FILE]\n"); 
      printf("Examples:\n\tmoney-exchange dollar 10.50 0.92\n"); 
      printf("\tmoney-exchange euro 5.99 1.09\n"); 
      printf("\tmoney-exchange prices.txt\n"); 
      return 1; 
    } 
    return 0; 
} 

ответ

1

Вы не предоставляете правильное количество аргументов для своей программы при ее запуске. Вы должны либо предоставить один или три аргумента (конечно, дополнительный, который является самой командой).

Другими словами, вы должны запустить его как что-то вроде:

money-exchange inputfile.txt 

или:

money-exchange dollar 42 0.9 

Как и в сторону, я не очень большой поклонник использования assert для этого, кстати, поскольку они обычно отключены в производственном коде. Лучше было бы для кода просто проверить argc и выйти с самим сообщением об ошибке. Таким образом, вы можете быть уверены, что это проверяется во всех случаях:

if ((argc != 2) && (argc != 4)) { 
    fprintf (stderr, "What the heck are you thinking?"); 
    return 1; 
} 

Вдвойне поэтому в данном случае, так как вы на самом деле есть код, который будет делать именно это, но assert покидает программу, прежде чем он доберется до этой точки , не позволяя ему показывать данные об использовании, если вы его неправильно назовете.

Я бы выбрал assert, это не дает вам никакой защиты, кроме того, что у вас уже есть, с проверкой argc.

Смежные вопросы