Autor
|
Tema: Guardar una linea de enteros separados por un espacio en C (Leído 6,321 veces)
|
FERNIIIIN
Desconectado
Mensajes: 11
|
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
Mensajes: 1.603
|
Intenta con strtok
|
|
|
En línea
|
|
|
|
FERNIIIIN
Desconectado
Mensajes: 11
|
Intenta con strtok
Tengo esto escrito pero no me deja avanzar en el GETS int main() { int total = 0, N, M; char **arreglo = NULL; char *buffer; // donde se guarda todo el texto char *token = NULL; while(token != NULL) { arreglo = realloc(arreglo , sizeof(char*) * (total +1)); arreglo[total] = token; printf("Nombre %i: %s\n",total +1,arreglo [total ]); total++; } }
Alguien me podría decir ¿en que me estoy equivocando?
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
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 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 Tercera buffer NO ESTA INICIALIZADO EN NINGUN LADO. Ahora la parte de 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
Mensajes: 3.705
🏴 Libertad!!!!!
|
Salida: 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 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int N,i = 0,len; char **arreglo = NULL; char *buffer; char *token = NULL; char temporal[1000]; fgets(temporal ,1000,stdin ); fgets(temporal ,1000,stdin ); do { arreglo = realloc(arreglo , sizeof(char*) * (i +1)); //arreglo[i] = token; // Esta linea esta bien, pero realmente recomiendo moverl el contenido de esta posicion de memoria a uno que si controlemos nosotros arreglo [i ] = calloc(len +1,sizeof(char)); printf("Numero %i: %s\n",i +1,arreglo [i ]); i++; }while(i < N && token != NULL); }
Saludos!
|
|
|
En línea
|
|
|
|
FERNIIIIN
Desconectado
Mensajes: 11
|
Salida: 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 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int N,i = 0,len; char **arreglo = NULL; char *buffer; char *token = NULL; char temporal[1000]; fgets(temporal ,1000,stdin ); fgets(temporal ,1000,stdin ); do { arreglo = realloc(arreglo , sizeof(char*) * (i +1)); //arreglo[i] = token; // Esta linea esta bien, pero realmente recomiendo moverl el contenido de esta posicion de memoria a uno que si controlemos nosotros arreglo [i ] = calloc(len +1,sizeof(char)); printf("Numero %i: %s\n",i +1,arreglo [i ]); i++; }while(i < N && token != NULL); }
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
Mensajes: 11
|
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.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
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 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:
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int N,i = 0,len; char *buffer; char *token = NULL; char temporal[5000]; fgets(temporal ,1000,stdin ); char arreglo[N][30]; fgets(temporal ,5000,stdin ); do { //arreglo[i] = token; // Esta linea esta bien, pero realmente recomiendo moverl el contenido de esta posicion de memoria a uno que si controlemos nosotros printf("Numero %i: %s\n",i +1,arreglo [i ]); i++; }while(i < N && token != NULL); }
Salida para N = 10 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 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
Mensajes: 17
|
Acá se reserva memoria para la cadena de entrada y para el array de números (ints) #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
Mensajes: 3.705
🏴 Libertad!!!!!
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
guardar texto en una sola linea
Programación Visual Basic
|
andrer03
|
1
|
1,846
|
3 Noviembre 2008, 00:29 am
por el_c0c0
|
|
|
La NSA no tiene problemas de espacio: puede guardar todas las llamadas de un ...
Noticias
|
wolfbcn
|
0
|
1,634
|
18 Marzo 2014, 17:51 pm
por wolfbcn
|
|
|
Lectura de Línea a Línea de un archivo de números enteros en C++
Programación C/C++
|
julian21931500
|
7
|
10,415
|
25 Febrero 2015, 04:11 am
por julian21931500
|
|
|
[Python] Evitar un espacio en una entrada de números enteros
Scripting
|
Geormarsch
|
3
|
3,174
|
4 Julio 2017, 07:16 am
por Geormarsch
|
|
|
problema (duda) al guardar un espacio en archivos c++
Programación C/C++
|
Pancho_Ibarra
|
0
|
2,186
|
6 Diciembre 2017, 04:46 am
por Pancho_Ibarra
|
|