Como ya se ha dicho Neil Butterworth en su respuesta anterior: C-Secuencias que no se termina con un carácter \ 0, no son C-Strings!
La única posibilidad que tiene es escribir un Adaptador inmutable o algo que cree una copia válida de la C-String con un carácter de terminación \ 0. Por supuesto, si la entrada está mal y hay un C-String definido como:
char cstring[3] = {'1','2','3'};
de hecho se traducirá en un comportamiento inesperado, porque no puede haber algo así como [email protected]\0
en la memoria ahora. Entonces el resultado de strlen() por ejemplo ahora es 6 y no 3 como se esperaba.
El siguiente método muestra cómo crear una caja de seguridad C-String en todo caso:
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;
}
Esto asegura que si se manipula el C-String para no escribir en la memoria de otra cosa.
Pero esto no es lo que quería. Lo sé, pero no hay otra manera de alcanzar la longitud de una matriz de caracteres sin terminación. Esto ni siquiera es un enfoque. Simplemente asegura que incluso si el usuario (o Dev) está insertando ***** para funcionar bien.
... entonces, ¿qué _desea_ terminar la cadena? Si no hay un terminador de cadena y no hay otra forma de inferir la longitud de la cadena de la cadena misma, necesita almacenar la longitud en una variable separada en alguna parte. –
Si no conoce la longitud y no tiene forma de saber la longitud, entonces no puede determinar la longitud. –
¿Cuánto dura un trozo de cuerda? Dos veces la distancia de un extremo al medio. – Johnsyweb