Как объединить две строки (одна переменная), но при этом можно повторно использовать один из аргументов (переменную)?
Я знаю, что этот вопрос был задан, но ответы, на которые я смотрел, не имели отношения к моему делу. В конце моей программы, куча файлов открыта для записи. Для простоты я ограничил список всего двумя. Переменная 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");