Как Нейл Баттерворт уже сказал в своем ответе выше: C-строки, которые не заканчиваются символом \ 0, не являются C-строками!
Единственный шанс, который у вас есть, - это написать неизменяемый адаптер или что-то, что создает действительную копию строки C с завершающим символом \ 0.Конечно, если ввод неправильный и есть C-строка, определенная как:
char cstring[3] = {'1','2','3'};
действительно приведет к неожиданному поведению, потому что сейчас в памяти может быть что-то вроде 123@4x\0
.Таким образом, результат функции strlen (), например, теперь равен 6, а не 3. Как и ожидалось.
Следующий подход показывает, как создать безопасную строку C в любом случае:
char *createSafeCString(char cStringToCheck[]) {
//Cast size_t to integer
int size = static_cast<int>(strlen(cStringToCheck)) ;
//Initialize new array out of the stack of the method
char *pszCString = new char[size + 1];
//Copy data from one char array to the new
strncpy(pszCString, cStringToCheck, size);
//set last character to the \0 termination character
pszCString[size] = '\0';
return pszCString;
}
Это гарантирует, что если вы манипулируете C-String, чтобы не записывать в память что-то еще.
Но это не то, что вы хотели.Я знаю, но нет другого способа достичь длины массива символов без завершения.Это даже не подход.Это просто гарантирует, что даже если пользователь (или разработчик) вставляет ***** для нормальной работы.