2017-01-29 1 views
1

Я пытаюсь разобрать некоторую информацию, полученную из веб-сервиса. Проблема в том, что я не могу преобразовать char [] в String. Я не получаю никаких ошибок, но строка пуста. Читайте много страниц в Интернете, включая Convert char array to String, но это не работает для меня.Arduino: Empty String при попытке передать Char [] в String

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

Попробуйте нулевой конец char array – Musa

ответ

0

Проблема возникла из-за содержимого dataStr, странное поведение было вызвано чем-либо отстранением в буфере esp8266. Я заменил строку String dataStr = esp8266.readString() по String dataStr = esp8266.readStringUntil (Word), являясь переменной String Word, известным в буфере, которое появляется после нужной мне строки.

1

Обязательно пч действительна при печати. Yo не нужно назначать ваш 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

Проблема, которую вы проиллюстрируете в своем примере, может быть вызвана нулевым указателем; или вы сталкиваетесь с странным поведением из-за массива символов с нулевым завершением.

В вашем небольшом примере вы создаете массив символов, который может не иметь нулевого окончания. Я попробовал, но мой компилятор (arduino) имеет тенденцию исправлять его случайно. В самом деле, он видит, что str2 подобен константе, поэтому он помещает ее в память программы и ничего в RAM-памяти. Следовательно, он инициализирует массив с 0. Но он видит, что 40 ячеек не используются, но первые три просто копируются в String, поэтому он никогда не создает 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"); 

Следует отметить, что, что tranformation является примером; компилятор будет делать другие предположения в зависимости от того, что написано.

Я не знаю точно, что вы делаете в своей программе в другом месте, но я думаю, что вы можете сделать все с помощью arduino String class. Например, ваш основной пример должен быть примерно таким:

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

Я уверен, что вы не должны использовать старую библиотеку c string; они сложны в использовании и очень опасны. Например, strncpy в основном бесполезен, он дает вам не что иное, как strcpy. В strncpy(nonceChar, pch, sizeof(nonceChar));, если pch слишком длинный, nonceChar не будет завершен нулем! Фактически вы могли бы использовать strlcpy вместо этого (он доступен в моем компиляторе arduino linux v1.6.9).

Также вы должны убедиться, что strstr не возвращает указатель NULL. Или лучше: используйте indexOf и убедитесь, что он не возвращает -1.

+0

Благодарим за помощь, ваш пример работает, но я заметил, что проблема связана с HTTP-запросом, который я храню в String «dataStr», по какой-либо причине он не работает со строками i получить из буфера esp8266 и вызвать странное поведение. – Victor