2015-09-28 3 views
1

то, что я хочу сделать, дается строка ввода, которую я буду не знаю, что это размер или количество токенов, сможете распечатать последний токен.получить последний токен строки в C

e.x .:

char* s = "some/very/big/string"; 
char* token; 

const char delimiter[2] = "/"; 

token = strtok(s, delimiter); 

while (token != NULL) { 
    printf("%s\n", token); 
    token = strtok(NULL, delimiter); 
} 

return token; 

и я хочу, чтобы мой возврат быть

строка

но то, что я получаю (нуль). Любые обходные пути? Я искал в Интернете и не могу найти ответ на этот вопрос. По крайней мере, для языка программирования C.

+0

Вы можете использовать basename API в C. char * basename (char * path); – user3799762

ответ

12

Если вы разметить на специфический характер, т.е. '/' в вашем примере, вам не нужно разметить строку на все: вызов strrchr найти позицию последнего '/' и добавьте 1 к полученному указателю, чтобы пропустить разделитель, например:

char *s = "some/very/big/string"; 
char *last = strrchr(s, '/'); 
if (last != NULL) { 
    printf("Last token: '%s'\n", last+1); 
} 

Demo.

+0

Это прекрасно! Спасибо! – Jack

4

Просто используйте другие переменный для хранения последних маркеров, прежде чем он получает нулевой

char s[] = "some/very/big/string"; 
char * token, * last; 
last = token = strtok(s, "/"); 
for (;(token = strtok(NULL, "/")) != NULL; last = token); 
printf("%s\n", last); 
+1

Вы могли бы упростить цикл for? Я не понимаю, что вы делаете. – bisuke

+0

@bisuke Это упрощение. Вы можете переписать его примерно так: 'while (токен! = NULL) { last = token; token = strtok (NULL, "/"); } ' –

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