2013-06-18 14 views
12

Ho una funzione che restituisce un array di caratteri e voglio trasformarlo in una stringa in modo da poterlo elaborare meglio (confrontare con altri dati memorizzati). Sto usando questo semplice per questo dovrebbe funzionare, ma non è così per qualche motivo (bufferPos è la lunghezza della matrice, buffer è la matrice e item è una stringa vuota):Trasforma array di caratteri in stringa

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

Il buffer ha la valori giusti e così fa bufferPos, ma quando provo a convertire, ad esempio 544.900.010.837.154, che detiene solo 54. Se aggiungo Serial.prints al per come questo:

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

l'output è questo:

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 

Cosa mi manca? Ci si sente come un compito così semplice e non riesco a vedere la soluzione ...

risposta

21

Se avete il nulla array di caratteri terminata, è possibile assegnare la matrice char alla stringa:

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

quanto riguarda la tua codice di loop, sembra giusto, ma proverò sul mio controller per vedere se ottengo lo stesso problema.

+8

Grazie! Per qualche ragione str() non ha voluto compilare, ma String() ha funzionato e funziona come previsto. – FloIancu

+0

'str' non è stato dichiarato in questo ambito (Compiler 1.8.3) –

+0

Downvoting perché str() non è una funzione Arduino. Tuttavia, String() funziona davvero così complimenti a Flolancu. –

0

Potrebbe essere necessario provare a creare un oggetto stringa temporanea e quindi aggiungere alla stringa di elemento esistente. Qualcosa di simile.

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

Questo mostra solo i primi due numeri. – FloIancu

-1

Ho cercato di nuovo e cercare questa domanda in baidu. Poi trovo 2 modi:

1,

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

essere consapevoli del fatto che a '\ 0' è necessario per array di char ch.

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; 
 
}

In questo modo, è inoltre necessario aggiungere il '\ 0' alla fine di array di caratteri.

Inoltre, il file strstream.h sarà abbandonata e sostituita dalla stringstream

2

Tre anni dopo, ho incontrato lo stesso problema. Ecco la mia soluzione, tutti si sentono liberi di tagliare e incollare. Le cose più semplici ci tengono svegli tutta la notte! In esecuzione su un ATMega, e Adafruit Feather 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 
} 

e otteniamo:

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 

Spero che questo aiuti qualcuno!

Problemi correlati