Сравнение массивов символов

У меня возникли проблемы со строками в небольшом приложении Arduino. Интересно, почему этот код работает:

mqtt.setServer("192.168.1.42", port);

а в этом коде нет:

IPAddress ip = MDNS.queryHost(...);
mqtt.setServer(ip.toString().c_str(), port);

Даже когда strcmp возвращает 0 при сравнении обоих:

strcmp(ip.toString().c_str(), "192.168.1.42"); // output = 0 => equality

Я также пробовал другие альтернативы, такие как создание массива char, но безуспешно:

String ipstr = ip.toString();
char ipchar[ipstr.length() + 1];
ipstr.toCharArray(ipchar, ipstr.length() + 1);

mqtt.setServer(ipchar, port);

Все альтернативы компилируются, но соединение mqtt никогда не устанавливается позже. Должно быть, я упускаю что-то очевидное, потому что это работает, когда я жестко кодирую строку «192.168.1.42».

, 👍1

Обсуждение

Что делает mqtt.setServer? Сохраняет ли он ссылку на указатель или копирует входную строку в свои собственные буферы? Если вы используете константу «192.168.1.42», эта строка будет статической. КОГДА вы используете ip.toString().c_str(), когда объект ip освобождается, но .setServer() все еще имеет ссылку на этот char*, он становится недействительным. Где библиотека, которую вы используете?, @Maximilian Gerhardt


1 ответ


Лучший ответ:

6

PubSubClient::setServer(const char * domain, uint16_t port) просто сохраняет указатель, а не копирует строку (вероятно, потому что ожидает литерал статической строки). (Источник)
В вашем случае, когда ip выходит за пределы области действия, указатель становится недействительным, поэтому он не будет работать.

Просто используйте вместо этого функцию PubSubClient::setServer(IPAddress ip, uint16_t port). (Источник)

Всегда читайте документацию по API, она есть в большинстве библиотек, хотя ее бывает трудно найти. Страницы ReadMe и Wiki на GitHub — хорошее место для начала.
Если этого недостаточно (нередко для проектов с открытым исходным кодом), прочтите заголовочные файлы, которые список всех функций библиотеки.
Если у вас все еще есть сомнения относительно того, что делает функция, обратитесь к фактическим файлам реализации.

,