Добавление строки для ввода имени файла в c - PullRequest
1 голос
/ 19 августа 2011

Мне нужно написать программу, используя системные вызовы, чтобы прочитать файл, перевернуть строку и распечатать ее в выходной файл.Если входной файл test.txt, вывод должен быть записан в файл reverse_test.txt.Пожалуйста, дайте мне знать, как я могу добавить строку reverse_ к имени выходного файла, в который я буду записывать результаты.

Я попробовал код ниже, но он выдает ошибку.

strcat("reverse_",argv[1]); 

Я написал остальную часть кода, и он отлично работает, но не может решить эту часть.

Ответы [ 3 ]

6 голосов
/ 19 августа 2011

Вы не можете добавить к литералу "reverse_". Попробуйте что-то вроде этого:

char str[ENOUGH] = {0};
snprintf(str, sizeof(str), "reverse_%s", argv[1]);
1 голос
/ 19 августа 2011

Функция стандартной библиотеки strcat () принимает два параметра: место назначения и исходную строку.

Это означает, что при попытке выполнить что-то вроде этого:

strcat( "reverse_", argv[1] );

фактически говоря что-то вроде этого:

"reverse_" = "reverse_" + argv[ 1 ]

.. что неверно, так как вы не можете изменить (или, по крайней мере, не должны) литерал "reverse_".Несомненно, вы не сможете изменить его длину, поскольку в процессе вы нарушите другие литералы использования в вашем коде.

@ cnicutar подсказал вам, как достичьрезультат, который вы ищете, но если вы хотите присоединиться к процессу, которому следовали, вот объяснение:

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

b) Вам нужно написать туда "reverse_".

c) Наконец, вам нужно объединить имя файла в argv [1]

Первый шагшокирующе самый сложный.Сколько места нужно?Заданное имя файла может содержать не более 255 символов:

http://en.wikipedia.org/wiki/NTFS

http://en.wikipedia.org/wiki/Ext4

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

http://support.microsoft.com/kb/830473

¡8192 символа! ... это ни к чему нас не приведет.

Гораздо лучший метод, обеспечивающий наилучшую точность, - это подсчитать количество символов в строке argv [1], затем добавить символы, необходимые для префикса, и зарезервировать это количество плюс один, так как мыТакже необходимо сохранить метку для конца строки:

const char * prefix = "reserve_";
int needed = strlen( argv[ 1 ] ) + strlen( prefix ) + 1;

char store[ needed ];

strcpy( store, prefix );                    // store <- prefix
strcat( store, argv[ 1 ] );                 // store <- store + argv[ 1 ]

printf( "%s\n", store );

Если вы не можете использовать эти типы векторов, вам следует зарезервировать и использовать динамическую память.

const char * prefix = "reserve_";
int needed = strlen( argv[ 1 ] ) + strlen( prefix ) + 1;

char * store = (char *) malloc( sizeof( char ) * needed );

strcpy( store, prefix );                    // store <- prefix
strcat( store, argv[ 1 ] );                 // store <- store + argv[ 1 ]

printf( "%s\n", store );
free( store );

Надеюсь, что этопомогает.

1 голос
/ 19 августа 2011

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

Вы можете сделать следующее:

 char *buffer;

 buffer = malloc (sizeof (char) * BUFSIZ);

 strcpy (buffer, "reverse_");
 strcat (buffer, argv[1]);

 /* Work here */

 free (buffer); /* before termination */  

Или вы также можете определить буфер как статический массив длиной BUFSIZ.

...