Как преобразовать char в string?

Тема в разделе "Arduino & Shields", создана пользователем ampedr, 8 фев 2016.

  1. ampedr

    ampedr Нерд

    Подскажите пожалуйста. Есть тип переменной:
    char name[140];
    Как понимаю, даже не char, а массив из этих char`oв.
    В эту переменную записывается информация одной функцией, а дальше мне всё содержимое такой переменной name надо сконвертировать в тип String чтобы у меня была потом возможность использовать свойство indexOf для проверки вхождения строки.
    Буду очень рад, если кто подскажет.
     
  2. Onkel

    Onkel Гуру

    string и char похожи, но не равнозначны - если в переменной string встретится ноль, то это будет означать конец строки, и функции строки работать с элементами массива за нулем не будут. А так разницы в принципе нет- указываете в функциях, работающих со строкой, указатель на массив char, и он будет все искать вхождения, ну с учетом указанной тонкости.
     
  3. ampedr

    ampedr Нерд

    Пример кода можно?
     
  4. Onkel

    Onkel Гуру

    не уверен, что прокатит в ide, но в С
    unsigned char R1[100];
    unsigned char R2[100];

    функция
    strcpy(R1,R2)
    cработает - она скопирует в R1 байты из R2 пока не встретит 0. (не '0', а именно 0x00)
     
    ampedr нравится это.
  5. ampedr

    ampedr Нерд

    А как объединение двух char переменных в одну, способствует преобразованию оных в иной тип? В данном случае string.
     
  6. Onkel

    Onkel Гуру

    применяйте функцию объединения строк, только надо чтобы в ваших char массивах стоял в конце нуль, а в середине, ясное дело , нулей быть не должно, иначе функция решит что это конец строки
    strcat(R1,R2)
    можно и в этой, и в функции strcpy() ввести ограничение на длину строки, это будут функции strncpy(R1,R2,n) и strncat(R1,R2,n).
     
    ampedr нравится это.
  7. ampedr

    ampedr Нерд

    Большое вам спасибо, Onkel.

    Я смотрю на функции:
    char * strcpy( char * destptr, const char * srcptr );
    char * strcat( char * destptr, const char * srcptr );
    И не понимаю, каким образом они могут привести char в String если работают исключительно с char, но тем не менее попробовав пример в IDE ардуино:

    char name1[140];
    char name2[140];
    String test;
    test = strcat(name1,name2);
    Всё прекрасно компилится, и главное работает.
    В итоге получаю полноценную String переменную test содержащую нужный мне текст, с которой уже могу работать посредством indexOf
    PS: про нуллбайт понял, буду в курсе.
    Ещё раз спс, задача решена.
     
  8. Onkel

    Onkel Гуру

    нет проблем. обращайтесь.
     
    ampedr нравится это.
  9. CryNET

    CryNET Гик

    Код (C++):
    String str;
    unsigned char a[] = {'H', 'e', 'l', 'l', 'o'};

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      str = (const char*) a;
     
      Serial.print(str);
    }

    void loop() {
      // put your main code here, to run repeatedly:
    }
     
    ampedr нравится это.
  10. Onkel

    Onkel Гуру

    а если в памяти после 'o' не нуль, то Serial.print(str) будет печатать Hello а потом далее пока не наткнется на 0. Если вы присваиваете указателю значение и потом работаете как с указателем на строку, вам надо озаботиться, чтобы после окончания данных (строки аscii символов) был 0.
     
    Последнее редактирование: 8 фев 2016
  11. lerik2703

    lerik2703 Гик

    зачем столько мучений ))) в IDE уже за вас подумали))
    Код (C++):
        char message[] =  {'H', 'e', 'l', 'l', 'o'};
        String stringOne =  String(message);
        Serial.println(stringOne);
     
     
    zealot01 и ampedr нравится это.
  12. Onkel

    Onkel Гуру

    можно и так нуль добавить, string () создает дубль и уже в дубле добавляет нуль. Но задача тс другая, в общем-то, не сделать дубль , а именно работать с массивом char как со строкой. Да он ее и решил уже.
     
  13. CryNET

    CryNET Гик

    А если добавить его?

    Код (C++):
    String str;
    unsigned char a[] = {'H', 'e', 'l', 'l', 'o'};

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      str = (const char*) a;
      str += '\0' //Вроде так
      Serial.print(str);
    }

    void loop() {
      // put your main code here, to run repeatedly:
    }
     
  14. Unixon

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

    Код (C++):

    String s("Hello");
    for (int i = 0; i < s.length(); i++)
    {
      char c = s[i];
    }
     
     
  15. Unixon

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

    @ampedr, создавайте сразу объект String, потом String.reserve(), потом работайте через [].
     
  16. Onkel

    Onkel Гуру

    ну это дело привычки. Я вообще без string работаю, в мк для разных string (в оперативке и во флеше) разные функции, строки туда/сюда качать приходится,и когда начинаешь серьезно данные лопатить проще с unsigned char все время работать.
     
    CryNET нравится это.
  17. Unixon

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

    Этот совет ТС не связан с личными предпочтениями. Я вообще плохо понимаю, что можно динамически выделять в МК с буквально несколькими килобайтами оперативки и предпочитаю статические буферы или стековые времянки.