Kombinieren directory-und file-path - C

Als Teil des Lernens C, schrieb ich den folgenden code zu kombinieren-Verzeichnis-Namen mit der Datei Namen. Eg: combine("/home/user", "filename") führt /home/user/filename. Diese Funktion wird voraussichtlich auf allen Plattformen funktionieren (atleast auf allen gängigen linux-Distributionen und windows-32-und 64bit).

Hier ist der code.

const char* combine(const char* path1, const char* path2)
{
    if(path1 == NULL && path2 == NULL) {
        return NULL;
    }

    if(path2 == NULL || strlen(path2) == 0) return path1;
    if(path1 == NULL || strlen(path1) == 0) return path2;

    char* directory_separator = "";
#ifdef WIN32
    directory_separator = "\\";
#else 
    directory_separator = "/";
#endif

    char p1[strlen(path1)];                    //(1)
    strcpy(p1, path1);                         //(2) 
    char *last_char = &p1[strlen(path1) - 1];  //(3)

    char *combined = malloc(strlen(path1) + 1 + strlen(path2));
    int append_directory_separator = 0;
    if(strcmp(last_char, directory_separator) != 0) {
        append_directory_separator = 1;
    }
    strcpy(combined, path1);
    if(append_directory_separator)
        strcat(combined, directory_separator);
    strcat(combined, path2);
    return combined;
}

Habe ich die folgenden Fragen in Bezug auf den obigen code.

  1. Betrachten Sie die Zeilen nummeriert 1,2,3. Alle diese 3 Zeilen sind für immer das Letzte element aus dem string. Wie es aussieht, bin ich mehr code schreiben für so ein kleines Ding. Was ist die richtige Methode, um das Letzte element aus der char* string.
  2. Das Ergebnis zurückgeben, ich bin die Zuweisung in einen neuen string mit malloc. Ich bin nicht sicher, ob dies der richtige Weg, dies zu tun. Aufrufer erwartet, dass free das Ergebnis? Wie kann ich an den Anrufer, dass er kostenlos das Ergebnis? Gibt es eine weniger fehleranfällige Methode zur Verfügung?
  3. Wie beurteilen Sie den code (gering, Mittel, Gut)? Was sind die Bereiche, die sein können, verbessertes Wohlbefinden?

Jede Hilfe wäre toll.

Bearbeiten

Behoben, alle die Probleme, die besprochen und umgesetzt werden die vorgeschlagenen änderungen übernommen. Hier ist der aktualisierte code.

void combine(char* destination, const char* path1, const char* path2)
{
    if(path1 == NULL && path2 == NULL) {
        strcpy(destination, "");;
    }
    else if(path2 == NULL || strlen(path2) == 0) {
        strcpy(destination, path1);
    }
    else if(path1 == NULL || strlen(path1) == 0) {
        strcpy(destination, path2);
    } 
    else {
        char directory_separator[] = "/";
#ifdef WIN32
        directory_separator[0] = '\\';
#endif
        const char *last_char = path1;
        while(*last_char != '\0')
            last_char++;        
        int append_directory_separator = 0;
        if(strcmp(last_char, directory_separator) != 0) {
            append_directory_separator = 1;
        }
        strcpy(destination, path1);
        if(append_directory_separator)
            strcat(destination, directory_separator);
        strcat(destination, path2);
    }
}

In der neuen version, Anrufer hat genügend Puffer und senden combine Methode. Dies vermeidet die Verwendung von malloc und free Problem. Hier ist die Verwendung

int main(int argc, char **argv)
{
    const char *d = "/usr/bin";
    const char* f = "filename.txt";
    char result[strlen(d) + strlen(f) + 2];
    combine(result, d, f);
    printf("%s\n", result);
    return 0;
}

Anregungen für weitere Verbesserungen?

Schreibe einen Kommentar