Encuentra el tamaño de una cuerda apuntada por un puntero

#include  int main () { char *ptr = "stackoverflow" } 

¿Hay alguna manera de encontrar la longitud del stackoverflow apuntada por ptr, ya que sizeof ptr siempre da 4

  1. sizeof() devuelve el tamaño requerido por el tipo. Como el tipo que pasa a sizeof en este caso es un puntero, devolverá el tamaño del puntero.

    Si necesita el tamaño de los datos señalados por un puntero, tendrá que recordarlos almacenándolos explícitamente .

  2. sizeof() trabaja en tiempo de comstackción. entonces, sizeof(ptr) return 4 or 8 bytes típicamente. En su lugar usa strlen .

Usa strlen para encontrar la longitud de (número de caracteres en) una cadena

 const char *ptr = "stackoverflow" size_t length = strlen(ptr); 

Otro punto menor, tenga en cuenta que ptr es un literal de cadena (un puntero a la memoria constante que no se puede modificar). Es una buena práctica declararlo como constante para mostrar esto.

La función strlen() proporcionada por string.h le indica cuántos “caracteres reales” contiene la cadena señalada por el argumento. Sin embargo, esta longitud no incluye el carácter nulo de terminación '\0' ; Hay que considerarlo si necesita la longitud para asignar memoria.

Esos 4 bytes son del tamaño de un puntero a char en su plataforma.

Puedes intentar usar:

 char *ptr = "stackoverflow" size_t len = strlen(ptr); 

Estás buscando la función strlen() .

 #include main() { int mystrlen(char *); char str[100]; char *p; p=str; printf("Enter the string..?\n"); scanf("%s",p); int x=mystrlen(p); printf("Length of string is=%d\n",x); } int mystrlen(char *p) { int c=0; while(*p!='\0') { c++; *p++; } return(c); } 

código simple para entender

Si ptr length es un argumento de una función, es razonable usar punteros como cadenas. Podemos obtener la longitud de la cadena por el siguiente código:

 char *ptr = "stackoverflow"; length=strlen((const char *)ptr); 

Y para más explicación, si la cadena es una cadena de entrada por usuario con longitud variable, podemos usar el siguiente código:

 unsigned char *ptr; ptr=(unsigned char *)calloc(50, sizeof(unsigned char)); scanf("%s",ptr ); length=strlen((const char *)ptr); 

Puramente usando punteros puedes usar aritmética de punteros:

 int strLen(char *s) { int *p = s; while(*p !='\0') { p++; /* increase the address until the end */ } Return p – s; /* Subtract the two addresses, end - start */ } 

A pesar de que esta es una pregunta genérica en C, se obtienen resultados bastante altos al buscar esta pregunta para C ++. No solo estaba en el territorio de C / C ++, también tenía que tener en cuenta las llamadas de función prohibidas del ciclo de vida de desarrollo de seguridad (SDL) de Microsoft para un proyecto específico que hizo que strlen no funcionara debido a,

Para aplicaciones críticas, como aquellas que aceptan conexiones anónimas de Internet, strlen también debe ser reemplazado

De todos modos, esta respuesta es básicamente un giro en las respuestas de los demás, pero con llamadas a funciones alternativas aprobadas de Microsoft C ++ y consideraciones para el manejo de caracteres amplios con respecto al límite actualizado de C99 de 65,535 bytes.

 #include  #include  int wmain() { // 1 byte per char, 65535 byte limit per C99 updated standard // https://stackoverflow.com/a/5351964/3543437 const size_t ASCII_ARRAY_SAFE_SIZE_LIMIT = 65535; // Theoretical UTF-8 upper byte limit of 6; can typically use 16383 for 4 bytes per char instead: // https://stijndewitt.com/2014/08/09/max-bytes-in-a-utf-8-char/ const size_t UNICODE_ARRAY_SAFE_SIZE_LIMIT = 10922; char ascii_array[] = "ACSCII stuff like ABCD1234."; wchar_t unicode_array[] = L"Unicode stuff like → ∞ ∑ Σὲ γνωρίζω τὴν ደሀ ᚦᚫᛏ."; char * ascii_array_ptr = &ascii_array[0]; wchar_t * unicode_array_ptr = &unicode_array[0]; std::cout << "The string length of the char array is: " << strnlen_s(ascii_array_ptr, ASCII_ARRAY_SAFE_SIZE_LIMIT) << std::endl; std::wcout << L"The string length of the wchar_t array is: " << wcsnlen_s(unicode_array_ptr, UNICODE_ARRAY_SAFE_SIZE_LIMIT) << std::endl; return 0; } 

Salida:

 The string length of the char array is: 27 The string length of the wchar_t array is: 47