2013-11-19 3 views
1

Я пытаюсь разбить строку с strtok на ее слова. Теперь произошло странное поведение:Сегментация Ошибка при доступе к strtok Указатель

При компиляции с Xcode и LLVM программа работает так, как должна.

Но компиляции с GCC вызывает ошибку при обращении указателя, созданного strtok

Вот код:

char *toTest ="Dieser String hat Groß und Kleinschreibung!"; 
char* shouldResults[]={"dieser","string","hat","groß","und","kleinschreibung"}; 
char* tokens = getTokenWords(toTest); 
int i = 0; 
int error = 0; 
while (tokens != NULL){ 
    char * toTest = shouldResults[i]; 
    if(strcmp(tokens,toTest) != 0){ 
     error = 1; 
     break; 
    } 
    tokens = strtok (NULL, " ,.-"); 
    i++; 
} 
return error; 

Функция getWordTokens объявлена ​​в другом модуле и выглядит следующим образом: AUTH. с:

char* getTokenWords(char *text){ 
    char *str = strdup(text); 
    int i; 
    for(i = 0; str[i]; i++){ 
     str[i] = tolower(str[i]); 
    } 
    char *pch; 
    pch = strtok (str," ,.-"); 
    return pch; 
} 

заголовок выглядит следующим образом: auth.h

#ifndef _AUTH_H 
#define _AUTH_H 
//creates tokens out of words from string 
char* getTokenWords(char *text); 

#endif 

Я импортировать auth.h, добавив:

#include "auth.h" 

в основном модуле.

Вы можете помочь мне с этой ошибкой?

+4

Ваш код выглядит так, как будто он должен работать. Есть пара ошибок - 'getTokenWords' утечки' str', и последнее сравнение не удается из-за! в конце Kleinschreibung! - но это просто приводит к тому, что команда 'error' получает (правильно). Если вы все равно получите segfault, можете ли вы опубликовать полный рабочий пример, пожалуйста? – simonc

+0

gcc и clang оба отлично справляются с этим кодом на MacOS 10.8. gcc 4.2.1. clang 4.0. valgrind clean. –

+0

Я использую gcc версии 4.2.1 (на основе Apple Inc. build 5658) (LLVM build 2336.11.00) – arnoapp

ответ

1

Функция strtok изменяет строку, которую вы передаете. Вы передаете ему указатель toTest, который указывает на строковый литерал, а не на массив символов. Я предполагаю, что XCode и LLVM хранят строковый литерал toTest указывают на запись в памяти, тогда как gcc помещает его в постоянное запоминающее устройство. Возможно, я ошибаюсь, но попробую объявить toTest как массив.

char toTest[] ="Dieser String hat Groß und Kleinschreibung!"; 
Смежные вопросы