2017-09-11 3 views
1
void splitLine(Document *document, location loc) { 

    char* newLine = malloc(loc.idx * sizeof(char) + 1); 
    char* origLine = strdup(Document_get_line(document, loc.line_no)); 
    char* nextLine = malloc((strlen(origLine)-loc.idx) * sizeof(char) + 1); 

    newLine = strncpy(newLine, origLine, loc.idx); 
    newLine[loc.idx] = '\0'; 

    nextLine = strncpy(nextLine, origLine+loc.idx, strlen(origLine)-loc.idx); 
    nextLine[strlen(origLine)-loc.idx] = '\0'; 


    Document_set_line(document, loc.line_no, newLine); 
    Document_insert_line(document, loc.line_no+1, nextLine); 

    free(newLine); 
    free(nextLine); 
    free(origLine); 

    newLine = NULL; 
    nextLine = NULL; 
    origLine = NULL; 

} 

Ce code est utilisé pour séparer la ligne 'loc.line_no'th' dans 'document' au niveau du caractère 'loc.idx'th en deux parties, mais je suis avoir du mal à suivre le code surtout à partir de la quatrième ligne de la fonction. S'il vous plaît aidez-moi à suivre ce que chaque ligne du code fait.scinder une ligne en deux lors de la création d'un éditeur de texte

+0

Il n'y a qu'une seule fonction que vous devriez apprendre à comprendre ce code, et c'est strncpy. Avez-vous lu ce qu'il fait? C'est la fonction de la bibliothèque C std. Rappelez-vous que l'assignation de '\ 0' à la fin d'un tableau char est de faire une chaîne terminée par un caractère nul - pour le rendre approprié à toutes les fonctions de manipulation de chaînes. – MattAPiroglu

+1

Les paires de lignes f/cinquième et sixième/septième copient les deux parties du texte scindé dans des emplacements temporaires. La première ligne de chaque paire utilise la fonction 'strncpy' qui protège contre le débordement de la mémoire tampon. Le second de chaque paire écrit une terminaison de chaîne de précaution ''\ 0'' car' strncpy' ne le fait pas toujours. La première partie de la ligne de séparation remplace alors la ligne existante dans le document texte et la seconde partie est insérée en tant que nouvelle ligne de texte. Ensuite, le stockage temporaire est 'free'd. –

Répondre

1

ici:

char* newLine = malloc(loc.idx * sizeof(char) + 1); 
char* origLine = strdup(Document_get_line(document, loc.line_no)); 
char* nextLine = malloc((strlen(origLine)-loc.idx) * sizeof(char) + 1); 

nous espace temporaire alloué dynamiquement, dans lequel nos opérations auront lieu. Notez que le contexte origLine est également initialisé à la ligne loc.line_no -th du document.

Maintenant, lisez strncpy(), puis poursuivez.

newLine = strncpy(newLine, origLine, loc.idx); va copier les premiers caractères loc.idx de origLine à newLine.

newLine[loc.idx] = '\0'; null-termine la chaîne newLine.

De même, ceci:

nextLine = strncpy(nextLine, origLine+loc.idx, strlen(origLine)-loc.idx); 
nextLine[strlen(origLine)-loc.idx] = '\0'; 

copiera les premiers strlen(origLine)-loc.idx caractères de la sous-chaîne de origLine, qui commence à loc.idx index -ème, à nextLine. Par conséquent, ces deux parties copient les deux parties de la ligne partagée vers des emplacements temporaires (qui ne sont valides que dans cette fonction).

Ces:

Document_set_line(document, loc.line_no, newLine); 
Document_insert_line(document, loc.line_no+1, nextLine); 

sont fonction fabriqués sur mesure, qui ne sont pas représentés ici, mais vous pouvez deviner que la première partie de la ligne fente remplace la ligne existante dans votre document, et la deuxième partie est insérée dans la ligne suivante, comme une nouvelle ligne.

Cette partie:

free(newLine); 
free(nextLine); 
free(origLine); 

newLine = NULL; 
nextLine = NULL; 
origLine = NULL; 

est pour de-allocation dynamique de la mémoire malloc() et strdup() alloué, puis définissez les pointeurs NULL, pour des raisons de sécurité.