2015-08-04 4 views
-2

Это строго для языка программирования c.заменить последнее слово в строке c

Я решил эту проблему некоторое время назад, но из-за потери данных мне пришлось переписать код.

Я использую cmake для создания программы, он использует относительные пути, которые определяются во время выполнения, чтобы получить текущий каталог bin.

, когда я получаю место бин во время выполнения обычно возвращает что-то вроде этого:

/Users/username/FOLDER/project/build/bin/Debug/ 
/Users/username/Library/Caches/cmake/gen/ad053ed7/Debug/bin/ 
/Users/username/FOLDER/project/build/bin/ 

Как вы можете видеть, что эти названия все довольно похожи, но немного отличается. Файлы, которые я хотел бы получить доступ к будет располагаться на удалении строки после второго до последнего завершающего слэша и заменить его с именем папки:

/Users/username/FOLDER/project/build/bin/folderName/ 
/Users/username/Library/Caches/cmake/gen/ad053ed7/Debug/folderName/ 
/Users/username/FOLDER/project/build/folderName/ 

Прямо сейчас я просто, имеющим самое трудное время получения этого снова разобрался.

Как я могу сделать что-то подобное в C, которое будет работать через эти и будущие возможные местоположения?

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

char *base_path = getBasePath(); //returns a string to current executable dir 

// Е ("% s \ п", базовый_путь);

size_t len = strlen(base_path); 
char* tmp = (char*)malloc(sizeof(char) * (len * 2)); //malloc a large chunk of space just for now 

memcpy(tmp, base_path, len); 
tmp[len-1] = '\0'; 

//printf("tmp:\t%s\n",tmp); 

const char sep = '/'; //possible separator conflicts on other platforms 

size_t max = 0; 
size_t slen = 0; 
for(size_t i = 0; i < len; i++) 
{ 
    if(tmp[i] == sep) 
    { 
     max = i; 
     //printf("%c",tmp[i]); 
    } 
    if(tmp[i] == '\0') 
    { 
     slen = i; 
     printf("len is:%zu\n",i); 
    } 
} 
//printf("%c, %zu\n",tmp[max], max); 
memcpy(tmp + max, "/resources/", 11); 

tmp[slen + 7] = '\0'; 
const size_t flen = slen + 7; 
realloc(tmp, slen+7); 
printf("tmp:\t%s\n",tmp); 

res_dir = (char*)malloc(sizeof(char) * flen); //res dir is static char* 
memcpy(res_dir, tmp, flen); 
res_dir[flen] = '\0'; 

// printf ("res dir: \ t% s \ n", res_dir);

free(base_path); 
+5

возможно ['strrchr()'] (http://linux.die.net/man/3/strrchr) поможет? –

+3

Показать код, который не работает. –

+0

Функция strtok будет полезна также – Sarwan

ответ

1
char *myfile = "folder/file.txt"; 
char *last_slash = strrchr(s, '/'); // reverse find from end 
char *last_word = &last_slash[1]; // next character after 

printf ("'%s' this is the last word", last_word); 

"'file.txt' is the last word" 

Похоже, вы хотите заменить последнее слово так ...

myfile[last_slash - myfile + 1] = 0; // null terminate after the last slash by setting character after slash to 0 
    char newstring[1024] = {0}; 
    char *replace_with = "this_new_file.txt" 
    sprintf (newstring, "%s%s", myfile, replace_with); 

    printf ("Result '%s'", newstring); 

"Result 'folder/this_new_file.txt'" 

Сделано несколько быстрых правок.

0

Прежде всего, сначала переверните строку. Затем, используя функцию strtok(), вы можете вырвать нужную строку. Снова верните точную строку.

Смежные вопросы