usando la función scanf con punteros al carácter

3 minutos de lectura

avatar de usuario
Saurabh.V

He escrito el siguiente fragmento de código:

int main() {
  char arrays[12];
  char *pointers;
  scanf("%s", arrays);
  scanf("%s", pointers);
  printf("%s", arrays);
  printf("%s", pointers);
  return 0;
}

porque da error cuando escribo scanf("%s", pointers)?

avatar de usuario
Fasco junior

char *pointers;

debe inicializarse. No puede escanear cadenas en pointers hasta que lo apuntes a alguna dirección. La computadora necesita saber dónde almacenar el valor que lee del teclado.

int main() {
  char arrays[12];
  char *pointers = arrays;
  scanf("%s", pointers);
  printf("%s", pointers);
  return 0;
}

  • Me gusta como diste la alternativa a malloc.

    – autista

    27 de enero de 2013 a las 9:47

avatar de usuario
Gigi

Porque está escribiendo en una dirección en la memoria que no se ha inicializado. Escribir en un puntero de memoria mediante un puntero no inicializado invoca un comportamiento indefinido. Asigne suficiente memoria:

pointers = malloc(256);
if(!pointers)
  perror("malloc");
else
  scanf("%255s", pointers);

O declararlo como una matriz estática:

char pointers[256];

También debe considerar usar fgets() en lugar de scanf().

Es posible que desee leer si está interesado en fgets ():

Diferencia entre scanf() y fgets()

  • “* punteros por defecto apunta a NULL” Esta es una gran falacia.

    – autista

    27 de enero de 2013 a las 9:23

  • ¿Por supuesto? no se garantiza que el puntero sea NULL, no es una variable estática

    –Emanuele Paolini

    27 de enero de 2013 a las 9:27

  • @KingsIndian, el código en esa edición está severamente roto. Además, scanf se comportará de manera diferente a fgets cuando le des el especificador de formato %s.

    – autista

    27 de enero de 2013 a las 9:44

  • @modifiablelvalue Se corrigieron los errores tipográficos. Solo sugerí fgets(). No dije que son equivalentes y alternativos entre sí. Espero que cualquiera lea el manual antes de usarlo si la persona no sabe cómo funciona una función estándar.

    – PP

    27 de enero de 2013 a las 9:59

  • @modifiablelvalue jeje, de todos modos agregué un enlace al manual y otra pregunta que describe las diferencias 🙂

    – PP

    27 de enero de 2013 a las 10:11

avatar de usuario
ATOzTOA

  • char *pointers; crea una variable de puntero.
  • pointers es el address señalado por pointersque es indeterminado por defecto.
  • *pointers son los datos en la dirección apuntada por pointerslo que no puede hacer hasta que se asigne la dirección.

Solo haz esto.

char arrays[12];
char *pointers;
pointers = arrays;
scanf("%s",pointers);

  • s/que es NULL por defecto/que es indeterminado por defecto/

    – autista

    27 de enero de 2013 a las 9:46

avatar de usuario
autista

pointers se está utilizando sin inicialización, como int x; printf("%d\n", x);. Debe hacer que su puntero apunte a algo antes de usarlo. ¿Qué libro estás leyendo?

pointers es un puntero unificado. No puedes escribir en él. Deberá asignar suficiente memoria para almacenar una cadena, como lo hizo con arrays. Con un puntero, es posible utilizar la asignación dinámica (cf. malloc).

avatar de usuario
el pratt

¿Podría dar más detalles sobre el error? No estoy cerca de un compilador en este momento.

Pero para que scanf e printf funcionen, debe tener esto en la parte superior de su programa:

#include <stdio.h>
#include <stdlib.h>

Ambas son bibliotecas estándar para C. IO contiene scanf, estoy bastante seguro de que printf está en el mismo. Pero hasta que sepa qué bibliotecas necesita para qué funciones, no está de más incluir ambas bibliotecas estándar para cada programa. Intente usar también archivos de encabezado personalizados para que no necesite #includes masivos para cada archivo.

no olvides malloc declaraciones para la asignación de memoria.

Pero no estoy seguro de lo que está intentando hacer con su código, por favor, explíquelo.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad