Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: FERNIIIIN en 6 Noviembre 2018, 19:51 pm



Título: Guardar una linea de enteros separados por un espacio en C
Publicado por: FERNIIIIN 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.


Título: Re: Guardar una linea de enteros separados por un espacio en C
Publicado por: MAFUS en 6 Noviembre 2018, 20:05 pm
Intenta con strtok


Título: Re: Guardar una linea de enteros separados por un espacio en C
Publicado por: FERNIIIIN 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?


Título: Re: Guardar una linea de enteros separados por un espacio en C
Publicado por: AlbertoBSD 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


Título: Re: Guardar una linea de enteros separados por un espacio en C
Publicado por: AlbertoBSD 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!


Título: Re: Guardar una linea de enteros separados por un espacio en C
Publicado por: FERNIIIIN 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]


Título: Re: Guardar una linea de enteros separados por un espacio en C
Publicado por: FERNIIIIN 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


Título: Re: Guardar una linea de enteros separados por un espacio en C
Publicado por: AlbertoBSD 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


Título: Re: Guardar una linea de enteros separados por un espacio en C
Publicado por: elgilun 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;
}



Título: Re: Guardar una linea de enteros separados por un espacio en C
Publicado por: AlbertoBSD 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


Título: Re: Guardar una linea de enteros separados por un espacio en C
Publicado por: FERNIIIIN en 9 Noviembre 2018, 21:06 pm
Lamento la demora, por cierto coloco este código super básico. Hace lo mismo pero no se compara a lo que han puesto hasta ahora.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. void mostrar_arreglo(int *A, int long_cad);
  5. void ordenacion_seleccion (int * A, int N);
  6. void intercambiar (int * A, int i, int j);
  7.  
  8. int main() {
  9. int  N, M, L, i, j=0;
  10.  
  11. scanf("%d", &N);
  12. scanf("%d", &M);
  13. L= N+M;
  14. int arreglo_n[N], arreglo_m[M], arreglo_final[L];
  15. for ( i= 0; i < N; i++) {
  16. scanf("%d", &arreglo_n[i]);
  17. }
  18. for ( i= 0; i < M; i++) {
  19. scanf("%d", &arreglo_m[i]);
  20. }
  21. for ( i = 0; i < L; i++) {
  22. if (i< N) {
  23. arreglo_final[i]= arreglo_n[i];
  24. } else {
  25. arreglo_final[i]= arreglo_m[j];
  26. j++;
  27. }
  28. }
  29. ordenacion_seleccion( arreglo_final, L);
  30. mostrar_arreglo( arreglo_final, L);
  31. }
  32.  
  33. void ordenacion_seleccion (int * A, int N)
  34. {//ordena un conjunto por seleccion
  35.    int i, j, k;
  36.    for (i = 0; i < N - 1; i++)
  37.    {
  38.        for (k = i, j = i + 1; j < N; j++)
  39.            if (A[j] < A[k])
  40.                k = j;
  41.        if (k != i)
  42.            intercambiar (A, i, k);
  43.    }
  44. }
  45.  
  46. void intercambiar (int * A, int i, int j)
  47. {//intercambiar lugares para completar la funcion ordenacion_seleccion
  48.    int tmp = A[i];
  49.    A[i] = A[j];
  50.    A[j] = tmp;
  51. }
  52.  
  53. void mostrar_arreglo(int *A, int long_cad)
  54. {
  55.  int i= 0;
  56.  for ( i= 0; i < long_cad; i++) {
  57.    printf("%d ", A[i]);
  58.  }
  59. }
  60.