2015-09-25 3 views
4

Я использую следующий код для перемещения дерева назад, и теперь я получаю разделитель в конце, например 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; 
} 
+0

он меняет имя строки, и я использую это имя в strcat – andre

+0

рассмотрен вопрос здесь 'strrev (буфер);' вы должны удалить слэш после команды Tthis – Abra001

+0

, как сказал @ Тим, замените 'strrev (buffer);' by 'strrev (buffer); buffer [strlen (buffer) - 1] = 0;' – Abra001

ответ

5

Если предположить, что каждый выход вы получите, будет иметь, что слэши, вы можете просто удалить его из окончательного вывода. В приведенном ниже фрагменте кода я условно проверяю, что 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/" 

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

"child/grandchild" 
+0

Не могу ли я сделать это внутри алгоритма? – andre

+2

Ваш код очень запутан, и у меня нет доступа к компилятору C на данный момент. Если вы хотите изменить алгоритм, то способ сделать это - изменить вашу логику. Вместо добавления '/' на _end_ на каждом шаге, вы должны добавить '/' в начале каждого шага, _except_ для корневого узла, который не получает _leading_ forward косой черты. –

+0

где начинается каждый шаг, я в замешательстве. Где правильное место для добавления косой черты /? – andre

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