Подскажите пожалуйста. Есть тип переменной: char name[140]; Как понимаю, даже не char, а массив из этих char`oв. В эту переменную записывается информация одной функцией, а дальше мне всё содержимое такой переменной name надо сконвертировать в тип String чтобы у меня была потом возможность использовать свойство indexOf для проверки вхождения строки. Буду очень рад, если кто подскажет.
string и char похожи, но не равнозначны - если в переменной string встретится ноль, то это будет означать конец строки, и функции строки работать с элементами массива за нулем не будут. А так разницы в принципе нет- указываете в функциях, работающих со строкой, указатель на массив char, и он будет все искать вхождения, ну с учетом указанной тонкости.
не уверен, что прокатит в ide, но в С unsigned char R1[100]; unsigned char R2[100]; функция strcpy(R1,R2) cработает - она скопирует в R1 байты из R2 пока не встретит 0. (не '0', а именно 0x00)
А как объединение двух char переменных в одну, способствует преобразованию оных в иной тип? В данном случае string.
применяйте функцию объединения строк, только надо чтобы в ваших char массивах стоял в конце нуль, а в середине, ясное дело , нулей быть не должно, иначе функция решит что это конец строки strcat(R1,R2) можно и в этой, и в функции strcpy() ввести ограничение на длину строки, это будут функции strncpy(R1,R2,n) и strncat(R1,R2,n).
Большое вам спасибо, 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: про нуллбайт понял, буду в курсе. Ещё раз спс, задача решена.
Код (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: }
а если в памяти после 'o' не нуль, то Serial.print(str) будет печатать Hello а потом далее пока не наткнется на 0. Если вы присваиваете указателю значение и потом работаете как с указателем на строку, вам надо озаботиться, чтобы после окончания данных (строки аscii символов) был 0.
зачем столько мучений ))) в IDE уже за вас подумали)) Код (C++): char message[] = {'H', 'e', 'l', 'l', 'o'}; String stringOne = String(message); Serial.println(stringOne);
можно и так нуль добавить, string () создает дубль и уже в дубле добавляет нуль. Но задача тс другая, в общем-то, не сделать дубль , а именно работать с массивом char как со строкой. Да он ее и решил уже.
А если добавить его? Код (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: }
ну это дело привычки. Я вообще без string работаю, в мк для разных string (в оперативке и во флеше) разные функции, строки туда/сюда качать приходится,и когда начинаешь серьезно данные лопатить проще с unsigned char все время работать.
Этот совет ТС не связан с личными предпочтениями. Я вообще плохо понимаю, что можно динамически выделять в МК с буквально несколькими килобайтами оперативки и предпочитаю статические буферы или стековые времянки.