2013-06-18 70 views
12

Tôi có hàm trả về mảng char và tôi muốn biến thành chuỗi để tôi có thể xử lý tốt hơn nó (so sánh với dữ liệu được lưu trữ khác). Tôi đang sử dụng đơn giản này cho rằng nên làm việc, nhưng nó không vì một lý do (bufferPos là chiều dài của mảng, buffer là mảng và item là một chuỗi rỗng):Biến mảng char thành chuỗi

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

Các buffer có giá trị đúng và do đó, bufferPos, nhưng khi tôi cố gắng để chuyển đổi, ví dụ 544900010837154, nó chỉ đúng 54. Nếu tôi thêm Serial.prints đến cho như thế này:

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

đầu ra là thế này:

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 

Tôi đang thiếu gì? Nó cảm thấy như một nhiệm vụ đơn giản như vậy và tôi không thấy các giải pháp ...

Trả lời

21

Nếu bạn có null mảng char chấm dứt, bạn có thể gán mảng char vào chuỗi:

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

Đối với bạn mã vòng lặp, có vẻ đúng, nhưng tôi sẽ thử trên bộ điều khiển của tôi để xem tôi có gặp vấn đề tương tự không.

+8

Cảm ơn bạn! Đối với một số lý do str() không muốn biên dịch, nhưng String() đã làm và nó hoạt động như dự định. – FloIancu

+0

'str' không được khai báo trong phạm vi này (Compiler 1.8.3) –

+0

Downvoting vì str() không phải là một hàm Arduino. Tuy nhiên, String() thực sự làm việc như vậy kudo để Flolancu. –

0

Có thể bạn nên thử tạo đối tượng chuỗi tạm thời và sau đó thêm vào chuỗi mục hiện có. Một cái gì đó như thế này.

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

Điều này vẫn chỉ hiển thị hai số đầu tiên. – FloIancu

-1

Tôi đã tìm kiếm lại và tìm kiếm câu hỏi này trong baidu. Sau đó, tôi tìm thấy 2 cách sau:

1,

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

Hãy nhận biết để mà '\ 0' là cần thiết cho mảng 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; 
 
}

Bằng cách này, bạn cũng cần phải thêm '\ 0' vào cuối mảng char.

Ngoài ra, tập tin strstream.h sẽ chấm dứt và được thay thế bằng stringstream

2

Ba năm sau, tôi chạy vào cùng một vấn đề. Đây là giải pháp của tôi, tất cả mọi người cảm thấy tự do để cắt-n-dán. Những điều đơn giản nhất giữ chúng ta cả đêm! Chạy trên một ATMega, và 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 
} 

Và chúng tôi nhận được:

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 

Hy vọng điều này sẽ giúp người!

Các vấn đề liên quan