将字符数组转换为字符串

23

我有一个返回char数组的函数,我想将其转换为字符串,以便更好地处理它(与其他存储的数据进行比较)。 我正在使用这个简单的方法,但出于某种原因它不起作用(bufferPos是数组的长度,buffer是该数组,item是一个空字符串):

```java for (int i = 0; i < bufferPos; i++) { item += buffer[i]; } ```
请注意,您需要保留HTML标记。
for(int k=0; k<bufferPos; k++){
      item += buffer[k];
      }

bufferbufferPos的值都正确,但当我尝试转换544900010837154这样的数字时,它只保留了54。如果我在for循环中添加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

我错过了什么?感觉这是一个非常简单的任务,但我无法找到解决方案...

请阅读Java中将字符数组转换为字符串,这将帮助您回答您的问题。 - Rahul Gupta
5个回答

33
如果您的字符数组以null结尾,那么可以将该字符数组分配给字符串:
char[] chArray = "some characters";
String String(chArray);

关于你的循环代码,看起来没问题,但我会在我的控制器上尝试一下,看看是否会出现同样的问题。


13
谢谢!由于某些原因,str() 不想编译,但是 String() 能够编译并且按预期工作。 - FloIancu
"str"在此范围内未声明(编译器1.8.3) - Bruno Yuzo
3
因为str()不是Arduino函数,所以被投反对票。然而,String()确实可用,因此向Flolancu致敬。 - Kenn Sebesta
1
@KennSebesta:str(chArray)不是一个函数,而是构造函数。在C++中,你不用写成:String str = new String(chArray),而是直接写成String str(chArray)...它们的效果是一样的。 - Florian Burel
但是你回答中的字符数组没有以空字符结尾。 - thepirat000

7

6

三年后,我又遇到了相同的问题。这是我的解决方案,大家可以随意复制粘贴。最简单的事情让我们彻夜难眠!此方案运行在ATMega和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
}

然后我们得到:

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

希望这能帮助到某些人!

0
也许你可以尝试创建一个临时字符串对象,然后将其添加到现有的项字符串中。就像这样。
for(int k=0; k<bufferPos; k++){
      item += String(buffer[k]);
      }

-1
我再次搜索了一遍,用百度搜索了这个问题。然后我发现有两种方法:

1,

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

注意:对于字符数组 ch,'\0' 是必需的。

2,

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

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

这样,您还需要在字符数组末尾添加'\0'。

此外,strstream.h文件将被弃用并被stringstream替代。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接