следующий предложенный код:
- безупречная компиляция
- использует допустимую строку формата при вызове, чтобы
fscanf()
- выполняла желаемую функциональность
- информирует пользователя через
stderr
, когда не удается открыть файл - завершает строки формата в `printf () с '\ n', чтобы каждый символ находился на новой строке
- печатает значение цифры c любых символов, еще не обработанных в операторе
switch()
. - следует аксиоме: только один оператор на строку и (самое большее) одно объявление переменной на оператор.
- документирует, почему заголовочный файл
stdlib.h
включается - должным образом завершается при сбое вызова
fopen()
вместо попытки чтения из (неоткрытого) файла
и теперь предложенный код:
#include <stdio.h>
#include <stdlib.h> // exit(), EXIT_FAILURE
void decrypt_and_print(char*);
int main( void )
{
char* file_name = "/home/baran/hw4/encrypted_p1.img";
decrypt_and_print( file_name );
return 0;
}
void decrypt_and_print( char* file_name )
{
FILE *fp = fopen( file_name, "rb" );
if( !fp )
{
perror( "fopen faiied" );
exit( EXIT_FAILURE );
}
printf("File opened successfully!");
char a;
while( fscanf(fp, "%c", &a ) == 1 )
{
switch( a )
{
case '0':
printf( " \n" );
break;
case '1':
printf( "-\n" );
break;
case '2':
printf( "_\n" );
break;
case '3':
printf( "|\n" );
break;
case '4':
printf( "/\n" );
break;
case '5':
printf( "\\\n" );
break;
case '6':
printf( "O\n" );
break;
default:
printf( "char: %d ignored\n", (int)a );
break;
}
}
}
предлагает изменить его так, чтобы он ожидал параметр командной строки с путем / именем файла, а не в зависимости от жестко заданного пути / имени
Предложить заменить
int main( void )
{
char* file_name = "/home/baran/hw4/encrypted_p1.img";
на
int main( int argc, char* argv[] )
{
char *file_name;
if( argc < 2 )
{
file_name = "/home/baran/hw4/encrypted_p1.img";
}
else
{
file_name = argv[1];
}