[ Foro de C ]

no encuentro la falla, ayuda

29-Jun-2013 09:21
miguel vargas inostroza
4 Respuestas

imprime asi               deberia imprimir asi
16569411-212345678-5      16569411-2
12345678-5                12345678-5                  

 
#include <stdio.h>
 
void digito(char rut[10])
 
{
	int suma=0,i;
	int k=2;
	for(i=7; i>=0; i--)
	{
		if (k == 8)
		{
			k = 2;
		}
		suma += (rut[i]-48)*k;	
		k++;
	}
 
	suma = 11-(suma % 11);
 
	if(suma == (rut[9]-48))
	{
 
	}
	else
	{
		printf("Rut erróneo ingrese nuevamente:");
	}
 
}
int main(int argc, char *argv[]) 
{
	int i;
	char rut[10][10];
	for (i=0 ; i<2 ;i++)
	{	
	 printf("Ingrese rut: ");
	 gets(rut[i]);
	 digito(rut[i]);
	}
	for (i=0 ; i<2 ;i++)
	{	
	 printf ("%s\n",rut[i]);
	}
}
 



29-Jun-2013 10:44
Nacho Cabanes (+31)

No hay ningún comentario, ni la lógica del programa es evidente, así que no tengo claro qué es lo que pretendes, pero sí veo algo que me suena a fallo:

Dices que debería escribir "16569411-212345678-5" y en su lugar escribe "16569411-2". Si es así, te está "recortando" los datos. Pero es que tú se lo has pedido así, porque estás usando "char[10]", y obviamente el dato inicial tiene más de 10 letras (en concreto, "16569411-212345678-5" tiene 20 letras).



30-Jun-2013 04:16
miguel vargas inostroza

Disculpe realice mal la pregunta y exposición de mi duda, el tema es el siguiente esta es una funcion dentro de otro programa que funciona bien el cual es el sgte.

 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 2
 
void digito(char rut[10]);
void ingresodatos ();
 
 
int main(int argc, char *argv[]) {
	int decision;
	int i;
	char nombres[35][50];
	char apellidos[35][50];
	char aux[50];
	char rut[10][10];
 
	while(decision!=5)
	{
		ingresodatos();
		scanf("%d",& decision);
		fflush(stdin);
		switch(decision)
		{
		case 1:
			for(i=0;i<=MAX-1; i++)
			{   
				fflush(stdin);
				printf("%d\n" , i+1 );
				printf("Ingrese nombres :");
				gets(nombres[i]);
				printf("Ingrese apellidos :");
				gets(apellidos[i]);
				printf("Ingrese Rut :");
				gets(rut[i]);
				digito(rut[i]);
			}
			break;
		case 2:
			for(i=0;i<=MAX-1;i++)
			{
 
				printf("\n%d.- %s\t %s\t %s\n", i+1, rut[i], nombres[i], apellidos[i]);
 
			}
			break;
		case 3:
			for(i=0; i<MAX;i++)
			{
				if(strcmp(apellidos[i],apellidos[i+1]) >0)
				{
					strcpy(aux,nombres[i]);
					strcpy(nombres[i],nombres[i+1]);
					strcpy(nombres[i+1],aux);
					strcpy(aux,apellidos[i]);
					strcpy(apellidos[i],apellidos[i+1]);
					strcpy(apellidos[i+1],aux);
 
				}
			}
			break;
		case 4:
			printf("End");
			break;
		default:
			printf("-Numero ingresado no valido-\n");
 
		}
	}
	return 0;
}
void ingresodatos()
{
	printf("\tMenu principal para crear planilla de 5 alumnos\n\n");
	printf("1.-Ingresar datos\n");
	printf("2.-Imprimir listado de alumnos\n");
	printf("3.-Ordenar listado de alumnos\n");
	printf("4.-Finalizar\n");
}			
 
void digito(char rut[10])
{
	int suma=0,j;
	int k=2;
	for(j=7; j>=0; j--)
	{
		if (k == 8)
		{
			k = 2;
		}
		suma += (rut[j]-48)*k;	
		k++;
	}
 
	suma = 11-(suma % 11);
 
	if(suma == (rut[9]-48))
	{
 
	}
	else
	{
		printf("Rut erróneo ingrese nuevamente:");
	}
 
}	
 




Primero ingreso los datos con al opcion 1.

El tema es que los rut me los imprime asi con la opcion 2.

16569414-212345678-516569414-7 miguel vargas
12345678-516569414-7 juan perez
16569414-7 pedro flores

y necesito que me los imprima asi.

16569414-2 miguel vargas
12345678-5 juan perez
16569414-7 pedro flores

De nuevo le pido disculpas por no realizar crrectamente la pregunta.
De antemano muchas gracias.


30-Jun-2013 04:19
miguel vargas inostroza

aah puse #define MAX 2 pero en el ejemplo que puse en la parte inferior corresponde a un Max 3.


30-Jun-2013 13:05
Nacho Cabanes (+31)

El fallo parece ser el mismo: tamaños incorrectos.

Recuerda que "char[10]" sirve para una cadena de NUEVE caracteres, porque debe terminar en carácter nulo (\0), que es lo que indica el final de la cadena.

Además, "gets" no hace comprobaciones de rango (por eso, te dará un "warning" en los compiladores modernos), de modo que si introduces una cadena de 10, 15 o 200 letras, la guardará en esa variable, con resultados impredecibles.

En tu caso, a continuación de una cadena no está el \0 que indica su final, sino inmediatamente hay otra cadena, de modo que las órdenes como "printf" escriben todas las letras hasta encontrar un carácter nulo... ¡así que escriben todas las cadenas seguidas, porque ninguna (salvo posiblemente la última) acaba en carácter nulo.

Parece que debería bastarte con "char[11]" (10 letras y la marca de final de cadena), pero no hay necesidad de ajustar tanto el tamaño, y menos si no vas a comprobar que lo que introduce el usuario es correcto.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)