switch - Encuentra el tamaño de una cuerda apuntada por un puntero
mouse adaptado para switch (9)
sizeof()
devuelve el tamaño requerido por el tipo. Dado que 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 .
sizeof()
funciona en tiempo de compilación. entonces,sizeof(ptr)
return 4 or 8 bytes
típicamente. En su lugar usastrlen
.
#include <stdio.h>
int main ()
{
char *ptr = "stackoverflow"
}
¿Hay alguna manera de encontrar la longitud del stackoverflow apuntada por ptr, ya que sizeof ptr siempre da 4
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 <iostream>
#include <Windows.h>
int wmain()
{
// 1 byte per char, 65535 byte limit per C99 updated standard
// https://.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
Estás buscando la función strlen()
.
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 = ""
size_t len = strlen(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 */
}
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 = "";
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);
Usa strlen para encontrar la longitud de (número de caracteres en) una cadena
const char *ptr = ""
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.
#include<stdio.h>
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