PDA

Ver la versión completa : Problema con strings en c ¬¬



Marquitos07
11/09/2009, 16:10
Bueno miren me mandaron un problema q consta de varias partes, yo tengo una funcion main() q simplemente es un menu, si elijo la primera opcion me amnda a otra funcion getline() q me lee una frase de hasta 80 caracteres ingresadas x teclado, luego regreso al menu de la funcion main y si c elije la 2º opcion me manda a una funcion copyStr q me copia la frase ingresada en getline pero en sentido inverso.
Pero lo q c me complica es de como de la funcion getline, una vez ingresada la frase como string, retornarla a main para luego usarla a copyStr ¬¬

DeathIceBlood
11/09/2009, 18:06
mmm no se entendio muy bien... pero por lo q yo entendi xD, asignale una variable String a la cadena que devuelve el metodo getline () y usala en el metodo copyStr :s

vofijatee
11/09/2009, 19:09
Bueno miren me mandaron un problema q consta de varias partes, yo tengo una funcion main() q simplemente es un menu, si elijo la primera opcion me amnda a otra funcion getline() q me lee una frase de hasta 80 caracteres ingresadas x teclado, luego regreso al menu de la funcion main y si c elije la 2º opcion me manda a una funcion copyStr q me copia la frase ingresada en getline pero en sentido inverso.
Pero lo q c me complica es de como de la funcion getline, una vez ingresada la frase como string, retornarla a main para luego usarla a copyStr ¬¬

No entendí mucho.

Creo que tenes un problema del ambito de las variables. Podrías declarar la variable fuera de la función getline(), para después poder "llamarla de cualquier lado"




#inlude <stdio.h>
#include <stdlib.h>

char str[80];

void getline()
{
printf("Escribi el texto \n");
scanf("%s", str);
}

void CopyStr()
{
printf("Habias escrito: \n");

longitud = strlen(str);
char* derecha = str;
char* izquierda = derecha + longitud -1;
char temp;
while (derecha < izquierda)
{
temp = *derecha;
*derecha++ = *izquierda;
*izquierda-- = temp;
}

printf(str);
prinf("\n");
}
void menu()
{

int op;

printf("Opcion 1: Leer cadena \n");
printf("Opcion 2: Copiar cadena \n");
printf("Opcion 3: Salir \n");
scanf("%d", &op);

switch (op)
{
case 1:
getline(); // escribo la cadena
menu(); // caudno termina muestro el menu
break;
case 2:
CopySrt(); // muestro la cadena
menu(); // caudno termina muestro el menu
break;
case 3:
exit(0); // salgo
}
}

int main()
{
menu();
return 0;
}


Fua hace cuanto no escribia en C, fucking laburos en PHP y .NET :/


edit: Me había faltado declarar "longitud" :$

salu2

Marquitos07
12/09/2009, 00:03
Miren les paso la consigna para q quede mas claro:



A - Enunciado: Realizar un programa completo denominado "palindro.c" que
presente un menú tipo ABCM con las opciones "Ingrese Frase", "Copia Frase",
"Comprueba Frase", "SALIR".
Al programa se ingresa una frase de caracteres ASCII por STDIN (Teclado) y este
determina si la misma es un palíndromo (es simétrica) o no. El programa indica,
además, un puntaje porcentual que se obtiene de la longitud en caracteres de la
misma respecto de la longitud máxima de 80 caracteres.

El procesamiento debe ser realizado siguiendo las siguientes especificaciones:

1-Se presenta un menú como se menciono anteriormente y se da un mensaje al
usuario por pantalla indicando que debe ingresar una línea de hasta 80
caracteres alfanuméricos.
2-Al seleccionar la opción correspondiente, el procesamiento de ingreso se
realiza utilizando una función propia (no de Biblioteca) denominada getline ( ).
Esta función ingresa la frase contando los caracteres. La frase finaliza con la
tecla de ENTER. La línea ingresada conforma una cadena de texto o STRING de
hasta 80 caracteres alfanuméricos.
3-Al seleccionar la opción correspondiente, la línea ingresada se guarda
mediante copiaStr ( ) en un nuevo STRING de caracteres. La función copiaStr ( )
utiliza otra función auxiliar invierteFrase ( ) para su operación.
4-Al seleccionar la opción correspondiente, el procesamiento de verificación se
realiza con la función esPalindro ( ) que toma el STRING ingresado en el
programa principal y lo valida como palidromo o no. La validación del palíndromo
no debe tener en cuenta los signos de puntuación, ni espacios o tabuladores. Una
vez finalizado el procesamiento anterior, el programa mostrará la línea en
pantalla en mayusculas a renglón seguido de la línea ingresada por el usuario,
conjuntamente con el puntaje porcentual obtenido seguido del signo %.
5-Al seleccionar la opción correspondiente, el programa indicará que espera una
nueva línea ó terminará si el usuario ingresa solo un ENTER.
6-Realice el diagrama de CHAPIN correspondiente al programa completo y sus
funciones.
7-Indique, para el compilador de su preferencia, los pasos y comandos necesarios
para la edición y compilación (indique el compilador utilizado).

Se recuerda que una cadena de caracteres es simétrica o un palíndromo, si cumple
que se puede leer igual al derecho que al revés.
Por ejemplo la frase, "DABALE ARROZ A LA ZORRA EL ABAD" es simétrica o un
palíndromo.

Esta buena la idea de lo q me respondiste pero al no poder usar variables globales me re caga y mi problema esta en q no tengo muy claro en como retornar el string de getline a menu y dsp poder usarlo en copyStr y demas ¬¬

Marquitos07
12/09/2009, 12:32
Bue me costo pero lo termine xD x si a alguno le interesa lo posteo =/ xq es re comun este ejercicio. Gracias a los q respondieron xD




#include<stdlib.h>
#include<stdio.h>

void menu();
void getline (char frase[]);
void copyStr (char inv[], char frase[]);
int StrLen (char frase[]);
void sin_espacio (char frase[]);
void esPalindro (char frase[]);

int main ()
{

menu();
system("pause");
}








void menu ()
{
int I=0, a=0;
float p;
char op, frase[80], inv[80];

printf("Ingrese la opcion deseada:\n\nA)Ingrese frase\nB)Copia frase\nC)Comprueba frase\nM)Salir\n\n");
while (I==0)
{
scanf("%c", &op);
fflush(stdin);
switch (op)
{
case 'A':
getline(frase);
p=StrLen(frase)*100./80.;
printf("\nLa frase ingresada es:\n%s\nY es un %.2f%% del maximo permitido\n\nIngrese una nueva opcion:\n\n", frase, p);
a=1;
break;
case 'B':
if(a==0)
{
printf("Ingrese una frase primero...\n");
menu();
}
copyStr(inv, frase);
printf("La frase ingresada en orden invertido es:\n%s\n\nIngrese una nueva opcion:\n\n", inv);
a=2;
break;
case 'C':
if(a==0)
{
printf("Ingrese una frase primero...\n");
menu();
}
esPalindro(frase);

break;
case 'M':
I++;
break;
default:
printf("\n\nIngrese una opcion valida...\nIngrese una nueva opcion:\n");
break;
}
}

}

void getline (char frase[])
{
int i;

printf("\n\nIngrese una frase:\n\n");
fflush(stdin);
gets(frase);
i=StrLen(frase);
if(i>80)
{
printf("Ingrese menos de 80 caracteres\n\n");
menu();
}
return;
}

void copyStr (char inv[], char frase[])
{
int i, j, a;

if(frase[0]=='\0')
{
printf("Ingrese una frase primero...\n\n");
menu();
}
i=StrLen(frase);
a=i;
for(j=0;j<=a;j++)
{
inv[j]=frase[i-1];
i--;
}
inv[j-1]='\0';
return;
}

int StrLen (char frase[])
{
int i=0;

while (frase[i]!='\0')
i++;
return (i);
}

void esPalindro (char frase[])
{
int i, j, c=0;

sin_espacio(frase);
j=StrLen(frase);
for(i=0;frase[i]!='\0';i++)
{
if(frase[i]==frase[j-1])
{
c++;
j--;
}
}
j=StrLen(frase);
if(j==c)
{
printf("La frase ingresada es un palindromo\n");
menu();
}
else
{
printf("La frase ingresada no es un palindromo\n");
menu();
}

}

void sin_espacio (char frase[])
{
int a=0, b=0;

while (frase[a]!='\0')
{
if (frase[a]!=' '&&frase[a]!='\t')
{
frase[b] = frase[a];
b++;
}
a++;
}
frase[b]='\0';
return;
}

vofijatee
12/09/2009, 15:16
Buenísimo