2015-01-22 2 views
0

Я столкнулся с этой довольно глупой проблемой, используя strtok() в C. Процедура в main, похоже, не касается моего измененного токена, в то время как те же работы в sub_routine, где единственное, что я сделал по-другому, - это сохранить знак токена в static.strtok() не относится к новому значению токена при последующих вызовах

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void sub_routine() 
{ 
    char str[80] = "This is { some important } website"; 
    char *val = NULL; 
    val = (char *)malloc(sizeof(char)*255); 
    strncpy(val, str, sizeof(str)); 
    static char s = '{'; 
    char *token; 

    /* get the first token */ 
    token = strtok(val, &s); 

    /* walk through other tokens */ 
    while(token != NULL) 
    { 
    printf(" %s\n", token); 
    s= '}'; 
    token = strtok(NULL, &s); 
    } 
} 

int main() 
{ 
    char symbol='{'; 
    char *string = NULL; 
    char *match = NULL; 
    char ref[255]="Do something here {Do it now}. What now?"; 

    string = (char *)malloc(sizeof(char) * 255); 
    strncpy(string, ref, sizeof(ref)); 

    match = strtok(string, &symbol); 
    printf("\n%s", match); 
    printf("\n%s", string); 
    if(string!= NULL) 
    { 
    symbol = '}'; 
    match= strtok(NULL, &symbol); 
    printf("\n%s\n", match); 
    } 
    sub_routine(); 
} 

Не мог бы кто-нибудь пролить свет на него?

+0

Почему вы используете 'strtok'? Это одна из худших функций в стандартной библиотеке c. – CodesInChaos

+2

Сепараторы должны быть заданы как строка с нулевым завершением. Вы передаете указатель на один символ, который, скорее всего, не заканчивается на нуль. Сделайте '' 'массив:' char s [2] = "{"; '. («Статическая» переменная может быть дополнена нулевыми байтами, что может объяснить ваше поведение.) –

+0

@CodesInChaos Какие альтернативы вы предлагаете (за исключением его реентерабельной версии)? – Anshul

ответ

1

Прототип

char * strtok (char * str, const char * delimiters); 

ул

С Строка для усечения. Обратите внимание, что эта строка изменяется путем разбиения на более мелкие строки (токены). Альтернативно может быть указан нулевой указатель, и в этом случае функция продолжает сканирование, где предыдущий успешный вызов функции завершился.

ограничители

C строку, содержащую символы-разделители. Они могут отличаться от одного вызова другому.

Измените код, как показано ниже:

char symbol="{";

Возможно, он работает в подпрограмме из-за того, что переменная s является статической и помещается в оперативную память, где после нее помещается 0x00. Это означает, что это может быть связано с удачей ...

+0

Да, это, вероятно, причина ошибки, но это должно быть 'char *' или, может быть, даже 'const char *'. –

2

strtok В качестве второго аргумента требуется строка . Здесь вы используете указатель на символ, который равен 1/2. Тем не менее, это неNULL-terminated (он не заканчивается (char)0). Заново

static char s = '{'; 

и

char symbol = '{'; 

в

static char *s = "{"; 

и

char *symbol = "{"; 

и заменить все вхождения &s и &symbol в strtok() звонки с s и symbol, соответственно.

Смежные вопросы