2017-01-29 128 views
1

我试图解析从web服务获得的一些信息。问题是我无法将字符[]转换为字符串。我没有得到任何错误,但字符串是空的。在互联网上阅读很多页面,包括Convert char array to String,但它不适合我。Arduino:尝试将字符[]转换为字符串时的空字符串

String dataStr = esp8266.readString(); // get the information 

const char *dataChar = (const char *)dataStr.c_str(); 
char * pch; 
pch = strstr (dataChar,"nonce"); //finds the first occurrence of nonce 
char nonceChar[40]; 
strncpy (nonceChar, pch, sizeof(nonceChar)); //copy just the part i need 
String result (nonceChar); 
Serial.println(result);//it prints nothing 
Serial.println(result.length()); //it prints 0 

我也试图用一个简单的例子,但我得到相同的空字符串:

char str2[40] 
str2[0]='a'; 
str2[1]='b'; 
String v (str2); 

在此先感谢

+1

尝试null终止char数组 – Musa

回答

0

问题来自dataStr的内容,奇怪的行为是由于esp8266缓冲区上的任何事情造成的。我替换了字符串dataStr = esp8266.readString() by String dataStr = esp8266.readStringUntil(Word),是字符串变量Word是我需要的字符串后面出现的缓冲区中存在的已知字词。

1

一定PCH是通过打印它有效。哟不需要将您的dataStr分配给其他变量。最后,对于相等的运算符,String类重载函数。您可以使用该示例:

String dataStr = esp8266.readString(); // get the information 

char * pch = strstr (dataStr.c_str(), "nonce"); 
char nonceChar[40]; 
memset(nonceChar, 0, 40); 
strncpy (nonceChar, pch, 39); 
String result = nonceChar; 

Serial.println(result);//it prints nothing 
Serial.println(result.length()); //it prints 0 
2

您在示例中说明的问题可能是由于空指针;或者由于非空终止的字符数组而遇到奇怪的行为。

在你的小例子中,你构造了一个char数组,它不能以null结尾。我尝试过,但我的编译器(arduino)往往会意外纠正它。事实上,它看到str2就像一个常量,所以它把它放在程序存储器中,而没有在RAM存储器中。因此,它使用0初始化数组。然而,它看到40个单元格未被使用,但是3个单元格仅被复制到一个字符串,因此它从不创建char str2[40]。您的小的代码:

char str2[40] 
str2[0]='a'; 
str2[1]='b'; 
String v (str2); 
Serial.println(v); 

通常被转换(/优化)由编译器为:

String v ("ab"); // note that "ab" is null-terminated 
Serial.println(v); 

或:

Serial.println("ab"); 

注意,改造的探讨是示例;编译器会根据写入的内容做其他假设。

我不知道你在你的程序中到底在做什么,但我认为你可以用arduino String class做所有事情。例如你的主要例子应该是这样的:

String dataStr("deb,nonce,end"); 
    int ind = dataStr.indexOf("nonce"); 
    String result = dataStr.substring(ind); 
    Serial.println(result); 

我很确定你不应该使用旧的C字符串库;它们使用起来很复杂并且非常危险。例如strncpy大多是无用的,它只能给你strcpy。在strncpy(nonceChar, pch, sizeof(nonceChar));如果pch太长,nonceChar将不会以null结尾!事实上,你可以使用strlcpy(它可以在我的arduino linux v1.6.9编译器中使用)。

此外,你应该检查strstr不返回NULL指针。或者更好:使用indexOf,并检查它是否不返回-1。

+0

感谢您的帮助,您的示例工作正常,但我注意到问题来自于存储在String“dataStr”中的http请求,由于任何原因它不适用于字符串i从esp8266缓冲区中获取并导致奇怪的行为。 – Victor