Nano Hash - криптовалюты, майнинг, программирование

Разрыв строки в C с несколькими пробелами

Итак, мой код в настоящее время разбивает единственную строку, подобную этой: «hello world» на:

hello
world

Но когда у меня есть несколько пробелов между ними, до или после строки, мой код не работает. Он занимает это пространство и считает его словом/числом для анализа. Например, если я поставлю два пробела между hello и world, мой код выдаст:

hello
(a space character)
world

Пробел фактически считается словом/токеном.

int counter = 0;
int index = strcur->current_index;
char *string = strcur->myString;

char token_buffer = string[index];

while(strcur->current_index <= strcur->end_index)
{
    counter = 0;
    token_buffer = string[counter+index];
    while(!is_delimiter(token_buffer) && (index+counter)<=strcur->end_index)//delimiters are: '\0','\n','\r',' '
    {
        counter++;
        token_buffer = string[index+counter];
    }

    char *output_token = malloc(counter+1);
    strncpy(output_token,string+index,counter);
    printf("%s \n", output_token);
    TKProcessing(output_token);

    //update information
    counter++;    
    strcur->current_index += counter;
    index += counter;
}

Я вижу проблемную область в своем цикле, но я немного не понимаю, как это исправить. Любая помощь будет оценена по достоинству.

29.06.2015

  • Вместо одного counter++ после прочтения слова снова используйте свою функцию is_delimiter с циклом while. 29.06.2015
  • добавьте элемент управления if(counter > 0) перед выполнением процесса output_token 29.06.2015

Ответы:


1

Используйте стандартную функцию библиотеки C strtok().

Вместо того, чтобы переделывать такую ​​стандартную функцию.

Вот соответствующая страница руководства.

В вашем случае можно использовать следующее:

#include <string.h>
char *token;    

token = strtok (string, " \r\n");
// do something with your first token
while (token != NULL)
{
  // do something with subsequents tokens
  token = strtok (NULL, " \r\n");
}

Как вы можете заметить, каждый последующий вызов strtok с теми же аргументами будет возвращать вам char*, адресованный следующему токену.

В случае, если вы работаете над многопоточной программой, вы можете использовать функцию Си strtok_r().

Первый вызов должен быть таким же, как strtok(), но последующие вызовы выполняются с передачей NULL в качестве первого аргумента. :

#include <string.h>
char *token;
char *saveptr;

token = strtok_r(string, " \r\n", &saveptr)
// do something with your first token
while (token != NULL)
{
   // do something with subsequents tokens
   token = strtok_r(NULL, " \r\n", &saveptr)
}
29.06.2015
  • Сделайте do something with your tokenized word комментарий как //do something with your tokenized word. Хотя это не имеет большого значения. 29.06.2015
  • еще один полезный справочник по strtok 29.06.2015
  • strtok_r не является стандартным 29.06.2015
  • @amdixon Кого это волнует? Это не требование. 29.06.2015
  • Здесь нет смысла использовать strtok_r вместо strtok. 29.06.2015
  • @MaximeB Ты не можешь знать. Что, если образец кода OP должен выполняться потоком? ... 29.06.2015
  • @nouney, не зная больше о контексте ОП, я бы не предположил 29.06.2015
  • @amdixon Точно, я бы не стал предполагать, что OP не использует потоки :) 29.06.2015
  • @MaximeB Ваш код не работает. Пожалуйста, попробуйте, прежде чем публиковать. 29.06.2015
  • Извините, но я немного запутался, как я могу вписать это в свой существующий код (все еще новый для C). 29.06.2015
  • @amdixon Кстати, strtok_r() соответствует стандарту POSIX.1-2001. 29.06.2015
  • @Bret просто используйте первый фрагмент кода, где токен — это ваше слово из строки char *, разделенной символами \r и \n. 29.06.2015
  • @nouney true, это хорошее решение для posix-совместимых систем. а для windows можно добавить псевдоним к strtok_s 29.06.2015
  • @Bret Если этот ответ помог, отметьте его как принятый :) 29.06.2015

  • 2

    С точки зрения кодирования, если вы хотите узнать, как это сделать без библиотеки в качестве упражнения, то происходит то, что ваш цикл прерывается после того, как вы сталкиваетесь с первым разделителем. Затем, когда вы переходите ко второму разделителю, вы не входите во второй цикл while и снова печатаете новую строку. Вы можете поставить

    //update information
    while(is_delimiter(token_buffer) && (index+counter)<=strcur->end_index)
    {
        counter++;
        token_buffer = string[index+counter];
    }
    
    29.06.2015

    3

    Просто поместите логику токена процесса в aif(counter > 0){...}, что сделает malloc только при наличии реального токена. как это

    if(counter > 0){ // it means has a real word, not delimeters 
       char *output_token = malloc(counter+1);
       strncpy(output_token,string+index,counter);
       printf("%s \n", output_token);
       TKProcessing(output_token);
    }
    
    29.06.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..