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

Я знаю, что этот вопрос был задан, но ответы, на которые я смотрел, не имели отношения к моему делу. В конце моей программы, куча файлов открыта для записи. Для простоты я ограничил список всего двумя. Переменная 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 не возвращает копию объединенных строк, но вместо этого добавляет 2-й аргумент к 1-му. Когда я искал обходной путь, я нашел эти рекомендации, чтобы использовать strcpy и strcat вместе или использовать sprintf.

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

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

3 ответа

Решение

Единственный способ:

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);

Вы можете использовать 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");
char temp_dir_path[256];
strcpy(temp_dir_path, dirPath);
fid_sensory_output = fopen(strcat(temp_dir_path, "sensory_output"), "w");
strcpy(temp_dir_path, dirPath);
fid_msn_output = fopen(strcat(temp_dir_path,"msn_output"), "w");
Другие вопросы по тегам