2016-03-11 2 views
-2

Я реализую программу, которая скрывает сообщения в файлах ppm, а затем извлекает их. Одна из последних вещей, которые мне нужно сделать, это «вернуть 2», если есть проблема с открытием файла. Если я введу файл, который нельзя открыть (файл не существует или неправильное расширение и т. Д.), Тогда он отобразит сообщение об ошибке на stderr, но по какой-то причине он не выполнит следующую строку: «return 2 «!C: never getting to return statement

Он просто возвращает 0 вместо возврата 2.

int load_ppm_image(const char *input_file_name, unsigned char **data, int *n, 
       int *width, int *height, int *max_color) 
{ 
    char line[80]; 
    char c; 

    FILE * image_file; 
    //image_file = fopen(input_file_name, "rb"); 

    if (fopen(input_file_name, "rb") == NULL) // checks to see if file cant be opened 
    { 
     fprintf(stderr, "The input image file could not be opened\n"); 
     return 2; // why isn't this being returned??? 
    } 
    else 
    { 
     image_file = fopen(input_file_name, "rb"); 
    } 

    fscanf(image_file, "%s", line); 

    fscanf(image_file, "%d %d", width, height); 

    *n = (3 * (*width) * (*height)); 

    fscanf(image_file, "%d%c", max_color, &c); 
    *data = (unsigned char *)malloc((*n)*sizeof(unsigned char)); 
    size_t m = fread(*data, sizeof(unsigned char), *n, image_file); 

    assert(m == *n); 
    fclose(image_file); 
    return 0; 
} 

int hide_message(const char *input_file_name, const char *message, const char *output_file_name) 
{ 
    unsigned char * data; 
    int n; 
    int width; 
    int height; 
    int max_color; 

    n = 3 * width * height; 
    int code = load_ppm_image(input_file_name, &data, &n, &width, &height, &max_color); 

    if (code) 
    { 
     // return the appropriate error message if the image doesn't load correctly 
     return code; 
    } 

    int len_message; 
    int count = 0; 
    unsigned char letter; 

    // get the length of the message to be hidden 
    len_message = (int)strlen(message); 

    for(int j = 0; j < len_message; j++) 
    { 

     letter = message[j]; 
     int mask = 0x80; 

     // loop through each byte 
     for(int k = 0; k < 8; k++) 
     { 
      if((letter & mask) == 0) 
      { 
       //set right most bit to 0 
       data[count] = 0xfe & data[count]; 
      } 
      else 
      { 
       //set right most bit to 1 
       data[count] = 0x01 | data[count]; 
      } 
      // shift the mask 
      mask = mask>>1 ; 
      count++; 
     } 
    } 
    // create the null character at the end of the message (00000000) 
    for(int b = 0; b < 8; b++){ 
     data[count] = 0xfe & data[count]; 
     count++; 
    } 

    // write a new image file with the message hidden in it 
    int code2 = write_ppm_image(output_file_name, data, n, width, height, max_color); 

    if (code2) 
    { 
     // return the appropriate error message if the image doesn't load correctly 
     return code2; 
    } 

    return 0; 
} 

Edit:

int main(int argc, const char * argv[]) 
{ 
    if (argc < 2 || argv[1][0] != '-') 
    { 
     // the user didn't enter a switch 
     fprintf(stderr, "Usage: no switch was entered.\n"); 
     return 1; 
    } 

    else if ((strcmp(argv[1], "-e") == 0) && (argc == 5)) 
    { 
     // hides a message in an output file 
     hide_message(argv[2], argv[3], argv[4]); 
    } 

    else if ((strcmp(argv[1], "-d") == 0) && (argc == 3)) 
    { 
     // retrieves a hidden message in a given file 
     retrieve_message(argv[2]); 
    } 

    else 
    { 
     // all other errors prompt a general usage error 
     fprintf(stderr, "Usage: error"); 
     return 1; 
    } 
} 
+0

Входит ли внутри этой функции? Работает ли инструкция печати? –

+0

Да, поэтому функции найдут свой путь к «fprintf (stderr,« Файл входного изображения не может быть открыт \ n »);» и напечатать это. Но он не будет печатать следующую строку. – TyCharm

+0

Что значит «не печатает следующую строку»? Как именно вы определяете, что 'return 2' не выполняется? – kaylum

ответ

1

Program ended with exit code: 0

Выхода кодом программы C является возвращаемым значением main или значение status в явном вызове exit функции. В вашем случае load_ppm_image возвращает значение функции вызывающего абонента hide_message, которая, в свою очередь, возвращает то же значение своей функции вызывающего абонента main. Однако main явно не возвращает ничего для случая, который вызывает hide_message. Стандарт C указывает, что main неявно возвращает 0, если он достигнет конца функции без явного возврата. Следовательно, код выхода 0 в вашем случае.

Чтобы получить желаемое поведение, измените код main, чтобы вернуть возвращаемое значение hide_message.

else if ((strcmp(argv[1], "-e") == 0) && (argc == 5)) 
{ 
    // hides a message in an output file 
    return (hide_message(argv[2], argv[3], argv[4])); 
} 
0

Из кода:

В основной функции вы вызываете функцию hide_message, но не собирающее возвращаемое значение hide_message()

hide_message(argv[2], argv[3], argv[4]); 

Таким образом, основная функция заканчивается с возвратом 0.