Как объединить две строки (одна из них является переменной), но при этом иметь возможность повторно использовать один из аргументов (переменную)?

Я знаю, что этот вопрос задавали, но ответы, которые я просмотрел, на самом деле не относились к моему делу. В конце моей программы открывается куча файлов для записи. Я ограничил список только двумя для простоты. Переменная dirPath — это аргумент командной строки, передаваемый при выполнении.

Вот что я попробовал в первую очередь:

FILE *fid_sensory_output;
FILE *fid_msn_output;

fid_sensory_output = fopen(strcat(dirPath,"sensory_output"), "w");
fid_msn_output = fopen(strcat(dirPath,"msn_output"), "w");

Это не работает, потому что strcat не возвращает копию объединенных строк, а вместо этого добавляет второй аргумент к первому. При поиске обходного пути я нашел эти рекомендации, чтобы использовать strcpy и strcat вместе или использовать sprintf.

Сначала я попробовал sprintf, но получил сообщение об ошибке, говорящее, что я пытался передать int вместо ожидаемого char *, хотя dirPath объявлен как char *. Я также безуспешно пытался передать строковый литерал.

Я пытался использовать strcat и strcpy разными способами, но безуспешно. Какие-либо предложения?


person aweeeezy    schedule 19.07.2014    source источник


Ответы (2)


Единственный путь:

FILE *fid_sensory_output;
char *string;

string=malloc(strlen(dirpath)+strlen("sensory_output")+1);
strcpy(string,dirpath);
strcat(string,"sensory_output");

fid_sensory_output = fopen(string, "w");
free(string);
person Abend    schedule 19.07.2014

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

snprintf возвращает количество символов, записанных в буфер (не включая разделитель строки '\0')

FILE *fid_sensory_output;
FILE *fid_msn_output;
char path[MAX_PATH];

snprintf(path, sizeof(path), "%s/%s", dirPath, "sensory_output");
fid_sensory_output = fopen(path, "w");

snprintf(path, sizeof(path), "%s/%s", dirPath, "msn_output");
fid_msn_output = fopen(path, "w");
person denisvm    schedule 19.07.2014