2017-03-20 2 views
-1
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void split_line(char **fields, char *line); 

int main() { 
    char *fields[5]; 
    char *line = "donuts,are,cool,and,tasty"; 
    int i = 0; 

    split_line(fields, line); 

    return 0; 
} 

void split_line(char **fields, char *line) { 
    int i = 0; 
    char *token, *delim; 
    delim = ",\n"; 
    token = strtok(line, delim); 
    while (token) { 
     fields[i] = malloc(strlen(token)); 
     strcpy(fields[i], token); 
     token = strtok(NULL, delim); 
     i++; 
    } 

} 

Ich bin neu in C und habe versucht, herauszufinden, wie Sie diesen Fehler für den besseren Teil einer Stunde zu beheben. Es kompiliert aber zur Laufzeit ichBusfehler: 10 in C Programm, kann nicht herausfinden, warum

Bus Error: 10.

Ich hätte gerne, wenn jemand zu mir führen könnte, warum dies geschieht und was ich falsch mache.

+2

Verwenden Sie den Debugger, Luke – immibis

+0

Es gibt eine Menge Vertrauen hier, dass es nicht mehr als 5 Einträge in 'Felder' geben wird. Wenn Sie die Grenzen überschreiten, wird es hässlich werden. – tadman

Antwort

0

Da Sie ein Zeichenfolgenliteral nicht ändern können, ist es nicht zulässig. Versuchen Sie, wie dies

char line[] = "donuts,are,cool,and,tasty"; 

Versuchen Sie auch, etwas anderes als strtok() dafür zu lernen, ohne die Eingabezeichenfolge zu ändern, weil strtok() das tut, und es ist, warum Sie eine Fehlermeldung erhalten.

Als Empfehlung, verwenden Sie immer const für Stringliterale

const char *line = "donuts,are,cool,and,tasty"; 

der Compiler wird Ihnen helfen, zu sehen, dass Sie etwas Schlechtes zu tun versuchen.

Auch Sie malloc() 1 weniger Zeichen als Sie brauchen. Zeichenfolgen benötigen Länge Zeichen + 1, das letzte Zeichen ist die null Terminator und es wird immer benötigt, wenn Sie die Daten als Zeichenfolge verwenden werden, erwarten alle Funktionen diesen Wert zu sein, so dass Sie zuordnen müssen Platz dafür, und kopieren Sie es auch

size_t length = strlen(token); 
fields[i] = malloc(length + 1); 
if (fields[i] != NULL) { 
    strcpy(fields[i], token); 
} 
+2

das ist wahr, aber noch einmal mit "wall of codes" fragen, da ist mehr dran: 'fields [i] = malloc (strlen (token));' gibt nicht genug speicher zu ... Man kann nicht ohne zu antworten antworten es funktioniert auf Ihrem Computer. –

+1

@ Jean-FrançoisFabre Der Aus-Ein-Fehler wiederholt sich wieder! – tadman

+0

@tadman Es ist so üblich ... –

0

Es ist wahrscheinlich der Fall, dass Sie falsch zuordnen. Wenn Sie Zugriff auf strdup haben, versuchen Sie, dass die Verwendung:

fields[i] = strdup(token); 

Sie verantwortlich sind schließlich den zugewiesenen Speicher freizugeben.

Verwandte Themen