Toma de entrada de cadena en el puntero char

#include #include #include int main(){ char *s; printf("enter the string : "); scanf("%s", s); printf("you entered %s\n", s); return 0; } 

Cuando proporciono entradas pequeñas de hasta 17 caracteres (por ejemplo, “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa es de larga duración”).

¿Hay algún problema con mi comstackdor (codeblocks) o mi PC (Windows 7)? ¿O está relacionado de alguna manera con el búfer de entrada de C?

Es un comportamiento indefinido ya que el puntero no está inicializado. No hay problema con tu comstackdor pero tu código tiene problema 🙂

Haga que apunte a la memoria válida antes de almacenar datos allí.


Para gestionar el desbordamiento de búfer, puede especificar la longitud en el especificador de formato:

 scanf("%255s", s); // If s holds a memory of 256 bytes // '255' should be modified as per the memory allocated. 

GNU C admite una extensión no estándar con la que no tiene que asignar memoria, ya que la asignación se realiza si se especifica %as se indica pero se debe pasar un puntero a puntero:

 #include #include int main() { char *s,*p; s = malloc(256); scanf("%255s", s); // Don't read more than 255 chars printf("%s", s); // No need to malloc `p` here scanf("%as", &p); // GNU C library supports this type of allocate and store. printf("%s", p); free(s); free(p); return 0; } 

el puntero char no está inicializado, debe asignarle memoria dinámicamente,

 char *s = malloc(sizeof(char) * N); 

donde N es el tamaño de cadena máximo que puede leer, y no es seguro usar scanf sin especificar la longitud máxima de la cadena de entrada, utilícelo de esta manera,

 scanf("%Ns",s); 

donde N igual que para malloc.

No está asignando memoria a su cadena y, por lo tanto, está intentando escribir en una dirección de memoria no autorizada. aquí

 char *s; 

Sólo estás declarando un puntero. No estás especificando cuánta memoria reservar para tu cadena. Puedes declarar esto de forma estática como:

 char s[100]; 

que reservará 100 caracteres. Si supera los 100, seguirá fallando como lo mencionó por la misma razón nuevamente.

No está asignando ninguna memoria a la matriz de caracteres, así que primero intente obtener memoria llamando a malloc () o calloc (). entonces trata de usarlo.

 s = malloc(sizeof(char) * YOUR_ARRAY_SIZE); ...do your work... free(s); 

Debe asignar suficiente memoria para el búfer donde su puntero apuntará a:

  s = malloc(sizeof(char) * BUF_LEN); 

y luego libere esta memoria si ya no la necesita:

  free(s); 

El problema está en tu código … nunca asignas memoria para el char * . Dado que no hay memoria asignada (con malloc() ) lo suficientemente grande como para contener la cadena, esto se convierte en un comportamiento indefinido.

Debe asignar memoria para s luego usar scanf() (prefiero fgets() )

En c ++ puedes hacerlo de la siguiente manera.

  int n; cin>>n; char *a=new char[n]; cin >> a; 

El código en C para leer un puntero de carácter.

 #include #include void main() { char* str1;//a character pointer is created str1 = (char*)malloc(sizeof(char)*100);//allocating memory to pointer scanf("%[^\n]s",str1);//hence the memory is allocated now we can store the characters in allocated memory space printf("%s",str1); free(str1);//free the memory allocated to the pointer }