Удаление разделителя пути в конце строки

Я использую следующий код для перемещения по дереву назад, и теперь я получаю разделитель в конце, например child/grandchild/< - Я хочу удалить этот разделитель. Я не знаю, что изменить в алгоритме для этого.

#include <stdio.h> #include <stdlib.h> #include <string.h> struct node { struct node *parent; char *name; }; char *buildPath(node* node, bool use_register_name) { struct node *temp = node; int length =0; do { length+=strlen(temp->name)+1; // for a slash; temp = temp->parent; } while(temp !=NULL); char * buffer =malloc(length+1); buffer[0] = '\0'; do { if(!use_register_name) { use_register_name=true; node = node->parent; continue; } char *name = strdup(node->name); strcat(buffer,"/"); strrev(name); strcat(buffer,name); node = node->parent; free(name); } while (node != NULL &&strcmp(node->name,"root")<0); strrev(buffer); return buffer; } int main(void) { struct node node1={ NULL, "root" }; struct node node2={ &node1, "child" }; struct node node3={ &node2, "grandchild" }; char * result=buildPath(&node3, false); printf(result); return EXIT_SUCCESS; } </string.h> </stdlib.h> </stdio.h>
1 ответ

Предполагая, что каждый полученный вами результат будет иметь эту конечную косую черту, вы можете просто удалить ее из окончательного вывода. В приведенном ниже фрагменте кода я условно проверяю, что result имеет хотя бы один символ и что последний символ является косой чертой. Если эти условия верны, я удаляю косую черту.

char * result = buildPath(&node3, false);
if (result && *result) { // make sure result has at least
 if (result[strlen(result) - 1] == '/') // one character
 result[strlen(result) - 1] = 0;
}

Update:

Вот решение вашей проблемы, которое модифицирует сам алгоритм. Попробуйте изменить код на следующее:

int firstCall = 1; // flag to keep track of whether this is first call (leaf node)
do {
 if(!use_register_name)
 {
 use_register_name=true;
 node = node->parent;
 continue;
 }
 char *name = strdup(node->name);
 if (firstCall) {
 firstCall = 0;
 }
 else {
 // ONLY add this slash to a non-terminal node
 strcat(buffer,"/");
 }
 strrev(name);
 strcat(buffer,name);
 node = node->parent;
 free(name);
} while (node != NULL &&strcmp(node->name,"root")<0);

Вот как ваш алгоритм в настоящее время строит путь для входов вашего OP:

buffer = "/dlihcdnarg" // note carefully this leading (really trailing) slash
buffer = "/dlihcdnarg/dlihc"

Затем ваш код меняет буфер в какой-то момент, чтобы получить следующее:

"child/grandchild/"

Добавив проверку для листа node и не добавляя в этом случае ведущую (действительно завершающую) косую черту, вы получите следующий результат:

"child/grandchild"

licensed under cc by-sa 3.0 with attribution.