Не люблю я Си-шные строки, не люблю эти низкоуровневые пляски со строками. Но вот понадобилось сделать интерфейс с такими строками. На первый взгляд все выглядело кошерно. Но полезли баги, и я чего только не передумал, пока не додебажился до проблемы в snprintf().
Так вот, оказывается snprintf() не умеет писать строку саму в себя. Зачем это нужно? Ну вот например код:
// connectUrl - имя/IP сервера (поле класса)
// connectPort - порт сервера (поле класса)
bool TcpChannel::open(const char *url, int port)
{
// Запоминаются URL и порт
snprintf(connectUrl, TCP_CHANNEL_MAX_URL_LEN, url);
connectPort=port;
// Устанавливается соединение (возвращает void)
tcpSocket->connectToHost(connectUrl, connectPort);
...
}
void TcpChannel::reConnect()
{
... всякая логика ...
// Переустанавливается соединение
open(connectUrl, connectPort);
}
Тут поле connectUrl из reConnect() передается в open() и должно записаться само в себя, то есть, вообще ничего не должно измениться по-хорошему. А вот болт. Первый байт строки будет обнулен и получится пустая строка. Не ожидал я такого. Как люди пишут на сях с такими строками - не понимаю.