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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Guardar una linea de enteros separados por un espacio en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Guardar una linea de enteros separados por un espacio en C  (Leído 6,321 veces)
FERNIIIIN

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Guardar una linea de enteros separados por un espacio en C
« en: 6 Noviembre 2018, 19:51 pm »

Buenas dias/tardes/noches a todos tengo un problema en el que espero que me puedan ayudar.

Necesito guardar un serie de números enteros que están separados por un espacio en un arreglo, es decir, me dan un número N que la longitud de mi arreglo A[N] y la siguiente entrada son N números que debo guardar en A, ejemplo:

5
1 3000 466 588 57778


Mi duda es como guardarlos, si estuvieran juntos los números o los ingresaran un seguido de otro seria fácil, pero de esta forma no se me ocurre que hacer.

Gracias a todo los que puedan darme unas ideas que implementar.


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Guardar una linea de enteros separados por un espacio en C
« Respuesta #1 en: 6 Noviembre 2018, 20:05 pm »

Intenta con strtok


En línea

FERNIIIIN

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Guardar una linea de enteros separados por un espacio en C
« Respuesta #2 en: 7 Noviembre 2018, 00:31 am »

Intenta con strtok

Tengo esto escrito pero no me deja avanzar en el GETS
Código
  1. int main() {
  2. int  total = 0, N, M;
  3. char **arreglo = NULL;
  4. char *buffer; // donde se guarda todo el texto
  5. char *token = NULL;
  6.  
  7.  scanf("%d %d", &N, &M);
  8.  gets (*buffer);
  9.  printf("%s\n", *buffer);
  10.  
  11. token = strtok(*buffer,",");
  12. while(token != NULL) {
  13. arreglo = realloc(arreglo, sizeof(char*) * (total +1));
  14. arreglo[total] = token;
  15. printf("Nombre %i: %s\n",total+1,arreglo[total]);
  16. total++;
  17. token=strtok(NULL,",");
  18. }
  19. }
  20.  

Alguien me podría decir ¿en que me estoy equivocando?
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Guardar una linea de enteros separados por un espacio en C
« Respuesta #3 en: 7 Noviembre 2018, 01:25 am »

En algun punto copiaste el codigo de algun lado y no sabes que hace  tal o cual linea.

Aqui un ejemplo funcional que publique hace unos dias, posiblemente copiasta algo de ahi... o alguien copio algo de ahi, publico el codigo y tu copiaste algo de ese codigo resultante en fin

https://foro.elhacker.net/programacion_cc/leer_archivo_csv-t489183.0.html

Código:
  scanf("%d %d", &N, &M);
  gets (*buffer);

Esa linea no tiene ningun sentido, Lees algo mediante scanf, y luego usas la funcion gets, En primera tienes que usar Scanf o gets, no puedes usar los 2 asi tal cual.
En segunda el gets esta mal escrito deberia de ser

Código:
 gets (buffer);

Tercera buffer NO ESTA INICIALIZADO EN NINGUN LADO.


Ahora la parte de
Código:
 strtok(*buffer,",");

Tambien esta mal escrita, no lleva el *,

y si quieres tealizar un tokenize mediante Espacios, deberias de usar " ", en lugar de ","

Dame unos minutos y te publico tu codigo. como debe de ser
 que tambies es para leer, sin embargo esta mal escrita
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Guardar una linea de enteros separados por un espacio en C
« Respuesta #4 en: 7 Noviembre 2018, 01:59 am »

Salida:

Código:
C:\codigos>tsss.exe
10
1 2 3 5 5 5 5 5 5 5
Numero 1: 1
Numero 2: 2
Numero 3: 3
Numero 4: 5
Numero 5: 5
Numero 6: 5
Numero 7: 5
Numero 8: 5
Numero 9: 5
Numero 10: 5


Codigo


Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. int main() {
  6. int  N,i = 0,len;
  7. char **arreglo = NULL;
  8. char *buffer;
  9. char *token = NULL;
  10. char temporal[1000];
  11. fgets(temporal,1000,stdin);
  12. N = strtol(temporal,NULL,10);
  13. token = strtok(buffer," ");
  14. fgets(temporal,1000,stdin);
  15. token = strtok(temporal," ");
  16. do {
  17. arreglo = realloc(arreglo, sizeof(char*) * (i +1));
  18.  
  19. //arreglo[i] = token; // Esta linea esta bien, pero realmente recomiendo moverl el contenido de esta posicion de memoria a uno que si controlemos nosotros
  20. len = strlen(token);
  21. arreglo[i] = calloc(len+1,sizeof(char));
  22. memcpy(arreglo[i],token,len);
  23. printf("Numero %i: %s\n",i+1,arreglo[i]);
  24. token = strtok(NULL," ");
  25. i++;
  26. }while(i < N && token != NULL);
  27. }

Saludos!
En línea

FERNIIIIN

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Guardar una linea de enteros separados por un espacio en C
« Respuesta #5 en: 7 Noviembre 2018, 21:58 pm »

Salida:

Código:
C:\codigos>tsss.exe
10
1 2 3 5 5 5 5 5 5 5
Numero 1: 1
Numero 2: 2
Numero 3: 3
Numero 4: 5
Numero 5: 5
Numero 6: 5
Numero 7: 5
Numero 8: 5
Numero 9: 5
Numero 10: 5


Codigo


Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. int main() {
  6. int  N,i = 0,len;
  7. char **arreglo = NULL;
  8. char *buffer;
  9. char *token = NULL;
  10. char temporal[1000];
  11. fgets(temporal,1000,stdin);
  12. N = strtol(temporal,NULL,10);
  13. token = strtok(buffer," ");
  14. fgets(temporal,1000,stdin);
  15. token = strtok(temporal," ");
  16. do {
  17. arreglo = realloc(arreglo, sizeof(char*) * (i +1));
  18.  
  19. //arreglo[i] = token; // Esta linea esta bien, pero realmente recomiendo moverl el contenido de esta posicion de memoria a uno que si controlemos nosotros
  20. len = strlen(token);
  21. arreglo[i] = calloc(len+1,sizeof(char));
  22. memcpy(arreglo[i],token,len);
  23. printf("Numero %i: %s\n",i+1,arreglo[i]);
  24. token = strtok(NULL," ");
  25. i++;
  26. }while(i < N && token != NULL);
  27. }

Saludos!

Muchas gracias, ayer tenia prisa y confundí el código con un ejercicio similar pero con mas entradas.
Un amigo me estaba ayudando y me mando parte del código, tal vez y si lo copio, pero como tenia prisa no pudo explicarme bien que había hecho.

Una ultima pregunta, ¿sabes si hay una función para pasar el valor que esta guardando el doble puntero (arreglo) a un array?

Es decir, algo así como:
**arreglo= arr[j]
En línea

FERNIIIIN

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Guardar una linea de enteros separados por un espacio en C
« Respuesta #6 en: 7 Noviembre 2018, 22:19 pm »

Basándome en parte de lo que creaste "AlbertoBSD" yo estoy haciendo otro, para ver si soy capaz de simplificarlo. En la noche lo subo.

SALUDOS. ;D
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Guardar una linea de enteros separados por un espacio en C
« Respuesta #7 en: 7 Noviembre 2018, 22:28 pm »

Pues técnicamente el "arreglo" es un Arrglo,

Es un arreglo de apuntadores que apuntan valga la redundancia a donde estan guardados los valores leídos

Si ves en las lineas

Código:
		arreglo[i] = calloc(len+1,sizeof(char));
memcpy(arreglo[i],token,len);
printf("Numero %i: %s\n",i+1,arreglo[i]);

Siempre se hace referencia a arreglo.



Tal vez lo que necesitas es un arreglo Fijo, pero al no conocer que te van a dar como N , no podras por metodos de arreglos fijos prevenir correctamente el valor de N

char arreglo[N][30];

Supongamos un N = 1000


Ejemplo:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. int main() {
  6. int  N,i = 0,len;
  7. char *buffer;
  8. char *token = NULL;
  9. char temporal[5000];
  10. fgets(temporal,1000,stdin);
  11. N = strtol(temporal,NULL,10);
  12. char arreglo[N][30];
  13. token = strtok(buffer," ");
  14. fgets(temporal,5000,stdin);
  15. token = strtok(temporal," ");
  16. do {
  17. //arreglo[i] = token; // Esta linea esta bien, pero realmente recomiendo moverl el contenido de esta posicion de memoria a uno que si controlemos nosotros
  18. len = strlen(token);
  19. memcpy(arreglo[i],token,len);
  20. printf("Numero %i: %s\n",i+1,arreglo[i]);
  21. token = strtok(NULL," ");
  22. i++;
  23. }while(i < N && token != NULL);
  24. }

Salida para N = 10

Código:
C:\codigos>ts1.exe
10
1 2 3 4 5 6 7 8 9 0
Numero 1: 1
Numero 2: 2
Numero 3: 3
Numero 4: 4
Numero 5: 5·a
Numero 6: 6
Numero 7: 7fúw~
Numero 8: 8
Numero 9: 9ÖÖ
Numero 10: 0


Salida para N=1000

Código:
Numero 961: 1
Numero 962: 2w╕τa
Numero 963: 3æ╝w Φa
Numero 964: 4
Numero 965: 5τa
Numero 966: 6w
Numero 967: 7@8
Numero 968: 8⌠
Numero 969: 9
Numero 970: 0µ
Numero 971: 1
Numero 972: 2
Numero 973: 3
Numero 974: 4
Numero 975: 5Θa
Numero 976: 6
Numero 977: 7
Numero 978: 8
Numero 979: 9ó╛wƱOuÉ
Numero 980: 0
Numero 981: 1
Numero 982: 2
Numero 983: 3
Numero 984: 4
Numero 985: 5
Numero 986: 6
Numero 987: 7
Numero 988: 8
Numero 989: 9Ωa
Numero 990: 0
Numero 991: 1Ωa
Numero 992: 2w
Numero 993: 3Ēw
Numero 994: 4
Numero 995: 5╝íw
Numero 996: 6
Numero 997: 7
Numero 998: 8
Numero 999: 9
Numero 1000: 0


Le memoria se podria limpiar con

char arreglo[N][30] = {0};

pero se me hace ineficiente hacerlo de esta forma.

Saludos
En línea

elgilun

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: Guardar una linea de enteros separados por un espacio en C
« Respuesta #8 en: 8 Noviembre 2018, 02:53 am »

Acá se reserva memoria para la cadena de entrada y para el array de números (ints)

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 32 /* supone hasta 32 dígitos para cada número */

int main()
{
    int size;    /* cantidad de números a ingresar */
    char *nums;  /* cadena de texto con los números de entrada */
    int *arr;    /* array de char* para la serie de números resultante */
    char *p;     /* referencia para strtok */
    int i;       /* índice del array */

    scanf("%d ", &size);

    nums = (char*)malloc(N * size); /* cada numero podría ser de N-1 dígitos */
    fgets(nums, N*size, stdin);

    arr = (int*)malloc(size * sizeof(int)); /* espacio para size ints */


    i = 0;
    p = strtok(nums, " ");
    while (p != NULL) {
        arr[i] = atoi(p); /* guarda cada número como int */
        i++;
        p = strtok (NULL, " ");
    }


    /* muestra el array */
    for(i = 0; i<size; ++i) {
        printf("%d) %d\n", i, arr[i]);
    }
    free (arr); /* liberar la memoria del array */
    free(nums); /* y libera la memoria de la cadena de entrada */

    return 0;
}

« Última modificación: 8 Noviembre 2018, 04:12 am por elgilun » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Guardar una linea de enteros separados por un espacio en C
« Respuesta #9 en: 8 Noviembre 2018, 04:52 am »

Excelente!  ;-)

Ahhhh!, arreglo de Enteros. si convertirlos mediante atoi esta bien. Suponiendo que siempre sea un numero valido. La otra funcion mas rubusta es strtol().

Saludos
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines