2012-02-27 6 views
2

Итак, я написал следующий код в linux (Ubuntu), используя текстовый редактор emacs, который в основном предполагал разделить строку на пройденном делителе. Когда я его запускал, он был прерван, я побежал его, хотя GDB, и это дает мне ошибку в strcpy (который я не вызываю), но, вероятно, неявно выполняется в sprintf. Я не думал, что делаю что-то неправильно, поэтому загрузился в окна и запустил его через визуальную студию, и он отлично работает. Я новичок в написании C в Linux и знаю, что проблема в цикле While, где я вызываю sprintf() (который нечетно, потому что вызов вне цикла записывает без возникновения ошибки), чтобы записать токен в массив. Если кто-нибудь скажет мне, в чем я ошибаюсь, я бы очень признателен. Вот кодПроблемы с компиляцией в linux

/* split() 
Description: 
- takes a string and splits it into substrings "on" the 
<delimeter>*/ 
void split(char *string, char *delimiter) 
{ 
    int i; 
    int count = 0; 
    char *token; 

    //large temporary buffer to over compensate for the fact that we have 
    //no idea how many arguments will be passed with a command 
    char *bigBuffer[25]; 

    for(i = 0; i < 25; i++) 
    { 
     bigBuffer[i] = (char*)malloc(sizeof(char) * 50); 
    } 

    //get the first token and add it to <tokens> 
    token = strtok(string, delimiter); 
    sprintf(bigBuffer[0], "%s", token); 

    //while we have not encountered the end of the string keep 
    //splitting on the delimeter and adding to <bigBuffer> 
    while(token != NULL) 
    { 
     token = strtok(NULL, delimiter); 
     sprintf(bigBuffer[++count], "%s", token); 
    } 

    //for(i = 0; i < count; i++) 
    //printf("i = %d : %s\n", i, bigBuffer[i]); 
    for(i = 0; i< 25; i++) 
    { 
     free(bigBuffer[i]); 
    } 

} //end split() 
+3

Ваша проблема не в компиляции на Linux - это с программой, которую вы пишете сбой. – Perry

ответ

4

Вы не проверяла NULL от возвращения strtok на последней итерации цикла ... так strtok может вернуться NULL, но вы по-прежнему передать значение NULL в token указатель до sprintf.

Изменить ваше время петля к следующему:

while(token = strtok(NULL, delimiter)) sprintf(bigBuffer[++count], "%s", token); 

Таким образом, вы никогда не можете передать NULL указатель на strtok, потому что в то время как петля NULL -указатель проверка будет обеспечивать, что token всегда имеет действительное значение, когда sprintf вызывается с ним в качестве аргумента.

+0

Большое спасибо за исправление моей проблемы. Но знаете ли вы, почему он работает в Windows, но не в Linux, или это только одна из тех ситуаций, когда C ведет себя по-разному в разных системах. – cpowel2

+2

На самом деле это не «работает» на Windows ... вам просто повезло, t crash ... вот почему они вызывают разыменование указателя 'NULL' ** неопределенного поведения ** ... вы можете упасть или что-то более гнусное может произойти, что оставит вас с большим количеством царапин на голове, когда какая-то другая таинственная ценность поврежден в памяти, и вы не знаете, почему :-) – Jason

+0

Вы можете просто изменить цикл while на это: 'while ((token = strtok (NULL, разделитель)))' и это будет работать нормально. –

0

Вы должны спросить gdb, чтобы получить полную информацию о том, где ваша программа разбилась. Тот факт, что вы не знаете точно, где он разбился, означает, что вы не просили его полностью отслеживать, что важно.