Проблема, которую вы проиллюстрируете в своем примере, может быть вызвана нулевым указателем; или вы сталкиваетесь с странным поведением из-за массива символов с нулевым завершением.
В вашем небольшом примере вы создаете массив символов, который может не иметь нулевого окончания. Я попробовал, но мой компилятор (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.
Попробуйте нулевой конец char array – Musa