2016-04-07 11 views
0

Ich schreibe ein Programm in Pure C (eine Voraussetzung für meine Ende des Jahres Kurs-Projekt). Es hat eine .dat Datei, die CSV-Werte speichert. Ich habe eine Funktion gefunden, um die Datei Zeile für Zeile zu lesen und eine Funktion, um die Zeile von der Datei durch einen Begrenzer zu trennen, die String-Split-Funktion funktionierte einwandfrei bis eine Änderung in IDEs. Ich habe eine Studentenlizenz bei JetBrains und habe kürzlich einen 64-Bit-Laptop gekauft, also habe ich auf CLion aufgerüstet. Dann begann ein Problem mit diesem spezifischen Bit Code, es hängt mein Programm, wenn es diese Codezeile erreicht, genauer gesagt, wenn die letzte Trennung in der Zeichenfolge gelesen wird.Eine Zeichenfolge durch einen Deliminator teilen

functions.c :: str_split

char** str_split(char* a_str, const char a_delim) 
{ 
    char** result = 0; 
    size_t count  = 0; 
    char* tmp  = a_str; 
    char* last_comma = 0; 
    char delim[2]; 
    delim[0] = a_delim; 
    delim[1] = 0; 

    /* Count how many elements will be extracted. */ 
    while (*tmp) 
    { 
     if (a_delim == *tmp) 
     { 
      count++; 
      last_comma = tmp; 
     } 
     tmp++; 
    } 

    /* Add space for trailing token. */ 
    count += last_comma < (a_str + strlen(a_str) - 1); 

    /* Add space for terminating null string so caller 
     knows where the list of returned strings ends. */ 
    count++; 

    result = malloc(sizeof(char*) * count); 

    if (result) 
    { 
     size_t idx = 0; 
     char* token = strtok(a_str, delim); 

     while (token) 
     { 
      assert(idx < count); 
      *(result + idx++)= strdup(token); 
      token = strtok(0, delim); 
     } 
     assert(idx == count - 1); 
     *(result + idx) = 0; 
    } 

    return result; 
} 

Und ist es so genannt in main.c :: Haupt

... 
while ((read =(size_t)getline(&file_line, &len, fp)) != -1) { 
     char **tokens; 
     tokens = str_split(file_line, ','); 
... 

Das Programm auf dieser Linie hängt ... Es wird kein Fehler ausgegeben, aber wenn es mit dem GDB Debugger gestoppt wird, zeigt die IDE an, diesen Fehler zu korrigieren, indem sie eine lib include vorschlägt, die helfen könnte, aber das führt auch zu keinem Erfolg. Output from the debugger..

+0

** pure c ** ist das ein Editor ..., IDE? – Michi

+1

'strdup 'ist keine Standardbibliotheksfunktion, aber einige Implementierungen setzen' strdup 'in' '. CLion hat offensichtlich "strdup" in '', also versuchen Sie es mit dieser Datei. – user3386109

+0

Sie sollten malloc auf Fehler überprüfen – Michi

Antwort

0

Das Problem wurde behoben, die CMakeList.txt wurde mit beliebigen Mitteln bearbeitet und die C-Kompilierungsstandards wurden geändert. Es wurde in c11 geändert, der Standard c11 implementiert nicht den Befehl strdup(), wie der Standard c99 verwendet, und er wurde mit dem Standard c99 und nicht mit c11 geschrieben.

+0

eigentlich ist das eigentliche Problem: Um den Prototyp für 'strdup()' zu bekommen, muss der Code mit einem oder mehreren der folgenden definiert werden: '_SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE> = 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED ||/* Seit glibc 2.12: */_POSIX_C_SOURCE> = 200809L' Schlage vor, diese Anweisung an den Anfang der Quelldatei zu setzen: '#define _POSIX_C_SOURCE = 200809L' Hinweis: Diese Definition wird oft benötigt. Schlagen Sie vor, das Setup für die IDE zu bearbeiten, um dies in die Parameter "-D" zu stellen – user3629249