Алгоритм разделяющий значение переменой char на слова и записывающий в массив.

Тема в разделе "Arduino & Shields", создана пользователем sanekfps, 5 янв 2017.

  1. sanekfps

    sanekfps Нерд

    Добрые люди помогите пожалуйста. Я облазил интернет и никак не могу понять, как сделать так чтобы текст записанный в char разделялся на слова.
     
  2. sanekfps

    sanekfps Нерд

    Вот на с а как на ардуино перевести не знаю.
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>

    char** parsedargs(int*, char*);

    int main () {

    int i;
    char array_tmp[80];
    printf("> ");
    gets(array_tmp);

    int argc = 0;
    char **argv = parsedargs(&argc, array_tmp);
    for (i = 0; i < argc; ++i) {
    printf("%s\n", argv);
    }

    for (i = 0; i < argc; ++i) {
    free(argv);
    }
    free(argv);

    return 0;
    }

    char** parsedargs(int *argc, char *argv_tmp) {
    int i;
    char * p;
    for(i = 1; i < strlen(argv_tmp) + 1; ++i) {
    if(argv_tmp == ' ' || argv_tmp == '\0') {
    while(argv_tmp[i+1] == ' ') {
    i++;
    }
    *argc = *argc + 1;
    }
    }
    if (argv_tmp[strlen(argv_tmp) - 1] == ' ') {
    *argc = *argc - 1;
    }
    if (argv_tmp[0] == ' ') {
    *argc = *argc - 1;
    }

    char **argv = malloc((*argc + 1) * sizeof(char*));
    p = strtok (argv_tmp," ");
    i = 0;
    while (p != NULL) {
    argv[i++] = p;
    p = strtok (NULL, " ");
    }
    free(p);

    return argv;
    }
     
  3. sanekfps

    sanekfps Нерд

    Если быть честным я и это ели ели понимаю.
     
  4. rkit

    rkit Гуру

    char это буква. Вы, наверное. про char * .

    как-то так
    Код (C++):
    char* str = "ваша строка";
    char* delim = " ,.";
    char* word = strtok (str, delim);
    while (word != NULL) {
       Serial.println(word);
       word = strtok (NULL, delim);
    }
     
  5. rkit

    rkit Гуру

    А для общего понимания читайте про массивы и указатели в C++
     
  6. sanekfps

    sanekfps Нерд

    Алгоритм я понял так. Если есть какой то из выделенных символов то оделить и написать.
     
  7. sanekfps

    sanekfps Нерд

    Спасибо.:)
     
  8. sanekfps

    sanekfps Нерд

    Пожалуйста, расскажите мне про все манипуляции(сравнение, стирание символа, добавление символа и т.п.) с переменой char*. В интернете я пока ничего не нашёл.
     
  9. Unixon

    Unixon Оракул Модератор

    С точки зрения ничтожного количества памяти на МК лучше какой-нибудь умный итератор наваять с автоматом обхода\разбора строки, чем реально подстроки в памяти разбрасывать.
     
  10. rkit

    rkit Гуру

     
  11. sanekfps

    sanekfps Нерд

    Алгоритм
    char* message[20];
    int i = 0;
    void setup() {
    Serial.begin(9600);
    char* str = "w a1 ad,a2.ag ah";
    char* delim = " ,.";
    char* word = strtok (str, delim);
    while (word != NULL) {
    word = strtok (NULL, delim);
    message=word;
    Serial.println(i);
    Serial.println(message);
    i++;
    }}
    void loop() {}

    работает непонятным образом. Всякий раз когда я его переношу из setup в loop он без конца меняет выводимое значение. И даже тогда когда я его скопирую и перенесу в другой проект. Если кто знает в чём проблема и как её решить прошу рассказать.
     
  12. rkit

    rkit Гуру

    Вы одну и ту же строку сто раз обрабатываете? Функция strtok изменяет входную строку для своих целей.
     
  13. sanekfps

    sanekfps Нерд

    Если строка strtok изменяет для своих целей тогда через какую переменную мне надо выводить в массив ?
     
  14. sanekfps

    sanekfps Нерд

    Я не понимаю. В вашем алгоритме strtok приравнивается word. И тогда word хранит то что использует strtok или обработанные данные?
     
  15. rkit

    rkit Гуру

    word это указатель на фрагмент входной строки.
     
  16. sanekfps

    sanekfps Нерд

    То есть word выдает кусок от того что алгоритм отделил от переменной?
     
  17. rkit

    rkit Гуру

    word это указатель на фрагмент входной строки.
     
  18. sanekfps

    sanekfps Нерд

    Ясно. Word это не переменная, это указатель на char.
     
  19. sanekfps

    sanekfps Нерд

    Получается надо word присвоить другой переменой и с ней уже работать.
     
  20. rkit

    rkit Гуру

    Это переменная, содержащая указатель.