2017-01-29 173 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