2015-09-15 3 views
2

Я новичок в C, и у меня есть код, но я не понимаю его часть.Объяснение кода C для токенизатора строка

typedef struct 
{ 
    size_t count; 
    char** strings; 
} Tokens; 

Tokens Tokenize(char* String, char Split) 
{ 
    Tokens t; 
    t.count = 1; 

    for (size_t i = 0; String[i] != 0; i++) 
    { 
     if (String[i] == Split) 
      t.count++; 
    } 

    t.strings =(char**) malloc(sizeof(char*)* t.count); 

    if (t.count > 0) 
     t.strings[0] = String; 

    for (size_t i = 0, j = 1; String[i] != 0; i++) 
    { 
     if (String[i] == Split) 
     { 
      t.strings[j] = &String[i + 1]; 
      String[i] = 0; 
      j++; 
      i++; 
     } 
    } 
    return t; 
} 

Та часть, я не понимаю, как указатель на указатель символ может разметить строковое часть, особенно та линия t.strings [J] = & String [я + 1];

Если кто-то может сделать визуализацию процесса, я был бы благодарен. Благодаря

+0

Используйте отладчик и выполните свой код. Там у вас есть ваша «визуализация». «Вопросы, требующие помощи по отладке (« почему этот код не работает? ») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения его в самом вопросе. Вопросы без четкого заявления о проблемах не являются полезными другим читателям. См.: Как создать [mcve]. " Если это работает, это OT в любом случае, мы не сайт для объяснения кода - извините. – Olaf

+2

@Olaf "Вопросы, требующие отладки справки (« почему этот код не работает? ») ....« Вы издеваетесь? насколько я могу вам сказать, он НЕ ищет отладочную помощь, и этот код, вероятно, работает. С того момента, когда мы не являемся сайтом для объяснения кода? Вот почему SO есть .. объяснить вещи людям. – Quest

+0

@Quest Спасибо! так много для вашего комментария – andre

ответ

1

особенно линейные t.strings [J] = & String [+ 1];

В этой строке, String[i] это разделитель символ (Split) найдено, поэтому String[i + 1] является символ в начале следующего маркера строки. Адрес этого символа (&String[i + 1]), то является указателем/адресом строки следующей строки токена.

t.strings[] - это всего лишь коллекция (массив) указателей строк, которая находится в String.

+0

да, но как & String [i + 1], символизировал строку? если он указывает на следующий токен, что случилось с предыдущей строкой перед этим токеном? как он сохраняется, так что теперь он рассматривается как токен? Можете ли вы поместить изображение, пожалуйста? – andre

+1

'String' - это адрес связки символов. Давайте используем «abcXdefXanotherXtoken», где «X» - это разделитель. По мере продвижения цикла эти символы становятся «abc_defXanotherXtoken» (где «_» представляет нуль, который я не могу распечатать), затем «abc_def_anotherXtoken» и, наконец, «abc_def_another_token». Цель массива 't.string []' состоит в том, чтобы отметить, где найти «d» в «def», «a» в «другом» и «t» в «токене». Эти адреса являются указателями на строки. – donjuedo

+1

Токовые строки остаются в памяти прямо там, где они начинаются. Нули, которые заменяют Split, также теперь служат нулевыми завершающими символами для токенов. – donjuedo

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