elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, YreX-DwX)
| | |-+  Fallo al dar valores a un array de chars
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Fallo al dar valores a un array de chars  (Leído 363 veces)
fileteruso

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Fallo al dar valores a un array de chars
« en: 16 Mayo 2020, 00:37 »

Hola, estoy intentando dar un valor a algunas posiciones de un array de chars y estoy teniendo un problema al final a la hora de devolverlo. Cuando le meto los valores se ve que lo está haciendo bien pero después, a la hora de imprimirlos, me devuelve, para cada posición que he escrito, el valor que le di al último. El código que llevo:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

int main(int argc, char* argv[]){

int n = 0;
char line[80], input[80];
char *array[25];

for(;fgets(line, 80, stdin);){
        if(!strcmp(line, "Exit\n")){
     break;
        }

   //  Leer de la entrada estándar
   sscanf(line, "%s", input);
   array[n] = input;
   printf("%s\n", array[n]);
   n++;
}

for(int i=0; i<n; i++){
printf("%s\n", array[i]);
}
}

Para la siguiente ejecución:
Código:
fileteruso@vbox-ubuntu:~/Escritorio/Pruebas$ ./prueba
ESTO
ESTO
ES
ES
UNA
UNA
PRUEBA
PRUEBA
Exit
PRUEBA
PRUEBA
PRUEBA
PRUEBA

Si alguien puede ayudarme le estaría muy agradecido.


« Última modificación: 16 Mayo 2020, 00:43 por fileteruso » En línea

YreX-DwX
Moderador
***
Desconectado Desconectado

Mensajes: 702



Ver Perfil
Re: Fallo al dar valores a un array de chars
« Respuesta #1 en: 16 Mayo 2020, 03:24 »

Hay varias incorrecciones pero digamos que el problema principal está en el operador =. Cuando se trabaja con punteros el operador = hace que el puntero de la izquierda apunte a la dirección de memoria que se especifique a la derecha.
En tu caso, cada uno de los punteros del array <array> están apuntando a la dirección de memoria de <input> e <input> contiene la última cadena introducida por la entrada estándar. Por lo tanto, todos los punteros del array están apuntando a una misma cadena, cuando muestras todas en el último bucle estás mostrando la misma cadena (<input>) n veces.

Otro error es el de usar un array de punteros. Como ves esto no sirve pues todos los punteros acabarán apuntando a un mismo sitio y cuando cambies el valor de esa variable, perderás todos los anteriores.
La solución: usar una matriz. Cada fila será una entrada y cada columna un carácter.
Código
  1. #define MAX_ENTRADAS 20 // Numero maximo de entradas por teclado
  2. #define MAX_LONGITUD 50 // Longitud maxima de cada entrada
  3.  
  4. int main(){
  5.  char matriz[MAX_ENTRADAS][MAX_LONGITUD];
  6. }
Aprovecho el código para decirte que utilices mejor constantes. Así si en algún momento quieres cambiar un valor, solo tendrás que cambiarlo en el lugar en el que lo has declarado.

Además de eso, otra incorrección es utilizar sscanf() para eliminar el salto de línea final (que supongo que lo haces para eso). Esto no es válido porque sscanf() no recoge los espacios por lo que una cadena con espacios (ej: "hola mundo") la truncará al primer espacio que encuentre ("hola").
Una alternativa para hacerlo es la siguiente:
Código
  1. #define SIZE 100
  2. //...
  3. char entrada[SIZE];
  4. fgets(entrada, SIZE, stdin);
  5. if(entrada[strlen(entrada)-1] == '\n') // el ultimo caracter siempre es '\0'. Entonces si el anterior es un salto de linea '\n'...
  6.  entrada[strlen(entrada)-1] = '\0'; // ... le pones el fin de cadena uno antes para eliminar el '\n'
  7.  

Otra cuestión es el tema de comparar cadenas. Si utilizas strcmp() y usas una longitud máxima de 5, al escribir "exit\n" solo se va a guardar "exit" y al compararlo no va a coincidir. Por esto es más seguro utilizar strncmp():
Código
  1. strncmp(matriz[n], "exit\n", strlen(matriz[n]))
Así compararás tantos caracteres como tenga la primera cadena. Si introduces "exit\n" y solo se guarda "exit", se compararán los 4 primeros caracteres de cada cadena y por tanto saldrá del bucle. Además si introduces "ex" pensando que va a comparar los dos primeros de la cadena, no saldrá porque comparará "ex\n" con "exi".

Y para futuras ocasiones, para copiar el contenido de una cadena en otra, tienes que utilizar las funciones strcpy() o strncpy(). Recomendable usar la segunda ya que puedes especificar la longitud.

Dicho esto puedes utilizar algo así:
Código
  1. while(n < MAX_ENTRADAS && fgets(matriz[n], MAX_LONGITUD, stdin) && strncmp(matriz[n], "exit\n", strlen(matriz[n]))){
  2.    if(matriz[n][strlen(matriz[n])-1] == '\n')
  3.        matriz[n][strlen(matriz[n])-1] = '\0';
  4.    ++n;
  5. }
Como puedes ver te ahorras los otros arrays auxiliares. Y debes comprobar primero que n no sobrepase el límite de entradas para que matriz[n] no produzca un error en memoria al intentar acceder a espacio de memoria no permitido.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
fileteruso

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: Fallo al dar valores a un array de chars
« Respuesta #2 en: 16 Mayo 2020, 04:28 »

Muchas gracias, duda(s) resueltas :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Recoger valores binarios en un array
.NET (C#, VB.NET, ASP)
sancakoky 4 2,390 Último mensaje 13 Noviembre 2011, 01:03
por Novlucker
Agregando valores a un array me da problema
.NET (C#, VB.NET, ASP)
TrashAmbishion 5 1,845 Último mensaje 27 Mayo 2012, 02:44
por $Edu$
[Duda] Valores Repetidos en array
Java
Slider324 2 3,332 Último mensaje 24 Julio 2012, 15:02
por luiggy2
Relacionar valores de un array
PHP
luchi 0 854 Último mensaje 17 Abril 2014, 01:36
por luchi
Problemas con asignación de valores en un array
Scripting
Neofito_2017 0 711 Último mensaje 3 Abril 2017, 17:06
por Neofito_2017
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines