2013-06-18 4 views
12

У меня есть функция, которая возвращает массив char, и я хочу, чтобы это превратилось в String, поэтому я могу лучше обработать его (по сравнению с другими сохраненными данными). Я использую этот простой для этого должно работать, но это не по какой-то причине (bufferPos длина массива, buffer является массив и item пустая строка):Преобразование char массива в String

for(int k=0; k<bufferPos; k++){ 
     item += buffer[k]; 
     } 

buffer имеет правильные значения и так делает bufferPos, но когда я пытаюсь преобразовать, например, 544900010837154, это справедливо лишь 54. Если добавить Serial.prints в течение примерно так:

for(int k=0; k<bufferPos; k++){ 
        Serial.print(buffer[k]); 
        Serial.print("\t"); 
        Serial.println(item); 
        item += buffer[k]; 
       } 

выход заключается в следующем:

5 
4 5 
4 54 
9 54 
0 54 
0 54 
0 54 
1 54 
0 54 
8 54 
3 54 
7 54 
1 54 

Что мне не хватает? Такое ощущение, что такой простой задачей, и я не вижу решения ...

ответ

21

Если у вас есть нулевой символ массива заканчивается, вы можете присвоить массив символов в строке:

char[] chArray = "some characters"; 
String str(chArray); 

как для вашего код цикла, он выглядит правильно, но я попробую мой контроллер, чтобы увидеть, получаю ли я ту же проблему.

+8

Спасибо! По какой-то причине str() не захотела компилировать, но String() выполняла и работает по назначению. – FloIancu

+0

'str' не был объявлен в этой области (компилятор 1.8.3) –

+0

Downvoting потому, что str() не является функцией Arduino. Тем не менее, String() действительно так увлекается Flolancu. –

0

Возможно, вам следует попытаться создать объект строки temp, а затем добавить к существующей строке элемента. Что-то вроде этого.

for(int k=0; k<bufferPos; k++){ 
     item += String(buffer[k]); 
     } 
+0

Это все еще показывает только первые два числа. – FloIancu

-1

Я ищу его снова и ищу этот вопрос в baidu. Тогда я нашел 2 способа:

1,

char ch[]={'a','b','c','d','e','f','g','\0'}; 
 
string s=ch; 
 
cout<<s;

Имейте в виду, что к '\ 0' необходимо для голец массива ч.

2,

#include<iostream> 
 
#include<string> 
 
#include<strstream> 
 
using namespace std; 
 

 
int main() 
 
{ 
 
\t char ch[]={'a','b','g','e','d','\0'}; 
 
\t strstream s; 
 
\t s<<ch; 
 
\t string str1; 
 
\t s>>str1; 
 
\t cout<<str1<<endl; 
 
\t return 0; 
 
}

Таким образом, вы также должны добавить '\ 0' в конце массив символов.

Кроме того, strstream.h файл будет оставлен и заменить stringstream

2

Три года спустя, я столкнулся с той же проблемой. Вот мое решение, все не стесняются вырезать-в-вставить. Самые простые вещи держат нас всю ночь! Бег на ATMega и Adafruit перо M0:

void setup() { 
    // turn on Serial so we can see... 
    Serial.begin(9600); 

    // the culprit: 
    uint8_t my_str[6]; // an array big enough for a 5 character string 

    // give it something so we can see what it's doing 
    my_str[0] = 'H'; 
    my_str[1] = 'e'; 
    my_str[2] = 'l'; 
    my_str[3] = 'l'; 
    my_str[4] = 'o'; 
    my_str[5] = 0; // be sure to set the null terminator!!! 

    // can we see it? 
    Serial.println((char*)my_str); 

    // can we do logical operations with it as-is? 
    Serial.println((char*)my_str == 'Hello'); 

    // okay, it can't; wrong data type (and no terminator!), so let's do this: 
    String str((char*)my_str); 

    // can we see it now? 
    Serial.println(str); 

    // make comparisons 
    Serial.println(str == 'Hello'); 

    // one more time just because 
    Serial.println(str == "Hello"); 

    // one last thing...! 
    Serial.println(sizeof(str)); 
} 

void loop() { 
    // nothing 
} 

И мы получаем:

Hello // as expected 
0  // no surprise; wrong data type and no terminator in comparison value 
Hello // also, as expected 
1  // YAY! 
1  // YAY! 
6  // as expected 

Надеется, что это помогает кто-то!

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