Autor
|
Tema: Problema al comparar cadenas de caracteres [C] (Leído 3,268 veces)
|
S4ms3pi0l__
Desconectado
Mensajes: 21
|
Tengo este problema al comparar cadenas de caracteres. A la hora de buscar un código previamente ingresado en el arreglo, este imprime el mensaje "No existe" cuando únicamente ingreso uno de los códigos. Ejemplo: Código ingresado en el segundo arreglo: cp020 Búsqueda: No Existe 'Nombre del producto' No existe #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> void menu(){ printf("\t*****CONTROL DE INVENTARIO*****\n"); printf("1.-Listado del inventario actual\n2.-Busqueda de productos\n3.-Ingresos totales\n4.-SALIR\n"); printf("--------------------------------\n"); } void salida(){ printf("Saliendo del programa... Hasta pronto!\n"); } struct Inventario{ char codigo[10]; char nombre[25]; int cantidad; float pventa; }; int Registrar(Inventario x[], int i){ for(i=0;i<=2;i++){ printf("\tRegistrar productos\n"); printf("Ingrese el codigo del producto: "); printf("\nIngrese el nombre del producto: "); do{ printf("\nIngrese la cantidad: "); scanf("%d",&x [i ]. cantidad); }while(x[i].cantidad<=0); do{ printf("\nIngrese el precio de venta: "); scanf("%f",&x [i ]. pventa); fflush(stdin ); //Limpieza del buffer }while(x[i].pventa<=0); } } void Lista(int i, Inventario x[]){ for(int j=0;j<=2;j++){ printf(" %s %s %d %0.2f \n",x [j ]. codigo, x [j ]. nombre, x [j ]. cantidad, x [j ]. pventa); } } char Busqueda(Inventario x[], int i){ char cod[10]; printf("Ingrese el codigo que desea buscar: "); for(int j=0;j<=2;j++){ if(strcmp(x [j ]. codigo, cod )==0){ printf("\nProducto: %s \n",x [j ]. nombre); break; }else{ break; } } } float Venta(Inventario x[], int i){ float total; for(int j=0;j<=2;j++){ total+=x[j].cantidad*x[j].pventa; //Primero, multiplica la cantidad por el precio y al final, se suma para el total del inventario vendedido. } printf("Ingreso total: %0.2f $ \n",total ); } int main(){ struct Inventario prod[20]; int i=0, op; bool salir = true; Registrar(prod,i); //Llamamos a la funcion "Registrar" do{ menu(); //Llamamos a la funcion "Menu" do{ printf("\nSeleccione una opcion: "); }while(op<=0 || op>=5); switch(op){ case 1:{ printf("\tINVENTARIO ACTUAL\n"); printf(" Codigo Producto Cantidad Precio de Venta\n"); Lista(i,prod); break; } case 2:{ Busqueda(prod, i); break; } case 3:{ printf("\tVENTA TOTAL DEL INVENTARIO\n"); Venta(prod, i); break; } case 4:{ salida(); salir = false; break; } } }while(salir==true); return 0; }
|
|
« Última modificación: 27 Noviembre 2017, 04:07 am por S4ms3pi0l__ »
|
En línea
|
|
|
|
BloodSharp
Desconectado
Mensajes: 812
¡ Hiperfoco !
|
int Registrar(Inventario x[], int i){ (...) printf("\nIngrese el nombre del producto: "); (...) } char Busqueda(Inventario x[], int i){ char cod[10]; printf("Ingrese el codigo que desea buscar: "); (...) }
Primero te recomendaría que elijas solo para ingresar strings scanf+ fflush o gets, si mal no recuerdo fflush no era necesario con gets, pero por otra parte estás en el scanf asignando mal la dirección de memoria del string cod, si ya de por sí es un puntero/array/etc... no hace falta asignarle el símbolo ampersand para especificarle dirección de memoria porque de por sí lo toma como dirección de memoria. En todo caso al asignarle ampersand al vector estarías especificandole que dentro de los valores basura que tiene cod dicho valor sea dirección de memoria, por lo tanto estaría guardandose el valor en cualquier lado y no en el vector real... El hecho que no haya crasheado el programa con eso sería raro habría que depurarlo para ver bién donde quedó guardado realmente el código ingresado... B#
|
|
|
En línea
|
|
|
|
S4ms3pi0l__
Desconectado
Mensajes: 21
|
Primero te recomendaría que elijas solo para ingresar strings scanf+fflush o gets, si mal no recuerdo fflush no era necesario con gets, pero por otra parte estás en el scanf asignando mal la dirección de memoria del string cod, si ya de por sí es un puntero/array/etc... no hace falta asignarle el símbolo ampersand para especificarle dirección de memoria porque de por sí lo toma como dirección de memoria. En todo caso al asignarle ampersand al vector estarías especificandole que dentro de los valores basura que tiene cod dicho valor sea dirección de memoria, por lo tanto estaría guardandose el valor en cualquier lado y no en el vector real... El hecho que no haya crasheado el programa con eso sería raro habría que depurarlo para ver bién donde quedó guardado realmente el código ingresado...
B#
El problema no está en el registro, el problema está en la búsqueda, porque si corres el programa en tu entorno, podrás observar que, al ingresar un código previamente ingresado y compararlo, el programa además de mostrar el nombre del producto al que le pertenece el código, también imprime otros dos mensajes del else
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Aparte del error con el scanf que te han marcado, el uso de gets (no recomendado y que se ha eliminado en las últimas versiones de C) y el uso de fflush en stdin (la función solo sirve para flujos de salida, en los de entrada no está especificado su funcionamiento) el error que tienes en Busqueda es que no realizas una búsqueda en el array, solo miras el primer elemento.
Sigue el flujo del programa. Entras en un for para recorrer el array y el if busca si existe el dato. Si lo encuentra devuelve el nombre y sale del for. Bien. La cosa viene cuando no encuentra el dato: directamente, sin tener en cuenta el resto del array, indica que no ha encontrado el producto y el break hace que salga del for, sin existir posibilidad de buscar en el resto del array.
Por tanto te falta algo para, en caso de que no se encuentre pase al siguiente elemento del array y diga que no hay existencias en caso de no encontrarse.
Por cierto, te iría bien separar la búsqueda de la presentación de resultados, verás que la lógica para llegar a la solución es más clara: es decir, por una parte buscas en el array y si encuentras el elemento marcas como que lo has encontrado y detienes la búsqueda pero si no lo has encontrado indicas que no ha habido éxito. Después según el resultado lanzas un mensaje u otro.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
¿Comparar dos cadenas de caracteres en php?
PHP
|
Netstat89
|
5
|
11,098
|
1 Octubre 2012, 21:21 pm
por Shell Root
|
|
|
Cadenas de caracteres. Función para comparar una cadena ignorando signos. C++
Programación C/C++
|
seryioo
|
1
|
3,995
|
12 Agosto 2015, 13:50 pm
por ivancea96
|
|
|
[C] Problema con caracteres y cadenas
« 1 2 »
Programación C/C++
|
n-utz
|
11
|
5,431
|
23 Mayo 2016, 00:53 am
por n-utz
|
|
|
Ayudaa!!! comparar cadenas de caracteres
Programación C/C++
|
judithmateos
|
7
|
3,779
|
18 Diciembre 2016, 03:59 am
por crack81
|
|
|
Problema con comparar cadenas
Programación C/C++
|
Jay
|
3
|
2,748
|
29 Abril 2021, 11:03 am
por MAFUS
|
|