2013-12-06 2 views
0

Я хочу, чтобы добавить каталог в имени файла в C, но я получаю сообщение об ошибке, как:Объединить имя файла в имени каталога

ошибки Segmentation (ядро сбрасывали)

Вот мой код :

char fname[255]; 
char directoryTmp[262]; 

/*Working Code for entering the filename fname with fgets() */ 
... 

/* specify the directory */ 
directoryTmp[0] = "/"; 
directoryTmp[1] = "f"; 
directoryTmp[2] = "i"; 
directoryTmp[3] = "l"; 
directoryTmp[4] = "e"; 
directoryTmp[5] = "s"; 
directoryTmp[6] = "/"; 

/* Copy fname at the end of directoryTmp */ 
strcat(directoryTmp,fname); 

/* new fname with the directory, should look like: "/files/afilename */ 
for(i=0;i<strlen(directoryTmp);i++){ 
    fname[i] = directoryTmp[i]; 
} 

// редактировать

ОК это мой новый код, но я все еще получаю тот же код ошибки:

char fname[255]; 
char directory[262]; 

directory[sizeof(directory) - 1] = '\0'; 
strncpy(directory,sizeof(directory) - 1, "/files/"); 


for(i=0;i<strlen(directory);i++){ 
    fname[i] = directory[i]; 
} 
puts(fname); 

fname[sizeof(fname) - 1] = '\0'; 
+0

Вы пробовали отладку? – elyashiv

+2

Помимо проблемы, упомянутой Александром в его ответе, вы теряете конечный нулевой символ после инициализации 'directoryTmp'. – Barmar

+0

Разве ваш компилятор не выкрикивает предупреждения, подающие эти источники. – alk

ответ

0

Погрешность в том, что вы забыли NUL прекратить вашу строку при заполнении directoryTmp (в строках C являются массив char, что по соглашению заканчивается на первом char, значение которого 0). Затем, когда strcat попробуйте добавить fname, он начинается с повторения по directoryTmp, ища символ NUL. Поскольку массив инициализируется в стеке (по крайней мере, я думаю, из фрагмента кода), его содержимое не определено, а strcat просматривает конец массива, который является неопределенным поведением (в вашем конкретном случае это вызывает ошибку сегментации).

Таким образом, правильный код будет:

/* specify the directory */ 
directoryTmp[0] = '/'; 
directoryTmp[1] = 'f'; 
directoryTmp[2] = 'i'; 
directoryTmp[3] = 'l'; 
directoryTmp[4] = 'e'; 
directoryTmp[5] = 's'; 
directoryTmp[6] = '/'; 
directoryTmp[7] = 0; // NUL terminate the string 

Или, как уже отмечалось другими, просто использовать strncpy:

memset(directoryTmp, 0, sizeof(directoryTmp)); 
strncpy(directoryTmp, "/files/", sizeof(directoryTmp) - 1); 

Обратите внимание, что strncpydoes not guarantee, что строка будет завершенным нуль, поэтому мы должны сами позаботиться об этом.

+0

, но вы этого не позаботились. Вы установили directoryTmp [261] в NULL, но все же после «/ files /» есть мусор. – zoska

+0

Согласно документации 'strncpy' , он выдает 'dest' с символами NUL, если длина' source' меньше, чем 'n': копирует первые число символов источника в пункт назначения. Если конец строки источника C (который сигнализируется нулевым символом) будет найден до того, как будет скопировано число символов, место назначения дополняется ze ros, пока в него не будет записано всего несколько символов. –

2

char s помещены в одиночные кавычки (''), а не в два раза (""). Вы назначаете строковые литералы для каждого индекса массива.

+0

«* Вы назначаете строковые литералы для каждого индекса массива. *« По крайней мере, OP пытается это сделать. не работайте, кроме 8-битного компьютера – alk

0

Вы можете просто сделать, как этот

char fname[255]; 
char directoryTmp[262]; 

/*Working Code for entering the filename fname with fgets() */ 
... 

/* specify the directory */ 
strcpy(directoryTmp,"/files/"); 


/* Copy fname at the end of directoryTmp */ 
strcat(directoryTmp,fname); 

/* new fname with the directory, should look like: "/files/afilename */ 
for(i=0;i<strlen(directoryTmp);i++){ 
    fname[i] = directoryTmp[i]; //You need to take care here. Because size of the fname is 255 and size of the directoryTmp is 262. you should check length of the fname in for loop. 
} 
Смежные вопросы