Problema en C

Li3cht

Buenas, he comenzado este año con el curso de ASI y una de las materias es Programación básica en C. De primeras, me está costando bastante, pero no quiero tirar la toalla y antes que no hacer nada, prefiero buscarme la vida.

Veamos, tengo un ejercicio por hacer sobre strings. El enunciado dice más o menos así:

  • Pedir una frase al usuario (misma cadena de texto), luego una palabra dentro de esa frase que el usuario quiera sustituir (por ej. "el niño es bueno" -> "el pequeño es bueno" (cambiamos la palabra niño siempre por pequeño)) y finalmente la palabra que quiera para sustituir a esa.

He sacado lo que sería la adquisición de datos y tengo en mente como sería el problema, pero no llego a plasmarlo como programa, me veo incapaz. Mi idea es, recorrer la cadena inicial hasta que encontremos la primera o única palabra que queramos sustituir, y guardar ese trozo mediante un strcpy en una variable a parte. A partir de aquí, ir concatenando mediante strcat el trozo restante de la frase.

Os adjunto en spoiler la adquisición y bueno, a ver si algún inspirado puede echarme un cable xD. Quisiera RECALCAR, que es programación básica. Estoy bastante limitado en lo que a comandos se refiere, lo típico: if, else, bucles, y strings (strcpy,strlen,strcat...), así que agradecería sin ser arrogante, que sea un código "principiante" y fácilmente entendible para mí, ya que no busco que me hagan los deberes, pero si no consigo sacarlo prefiero sacarme yo solo las castañas del fuego :P.

Un saludo! (y perdonar por algunas cosas en catalán)

spoiler
VipeR_CS

Ahora mismo estoy en el curro y no puedo ayudarte, si cuando llegue a casa no te han contestado intento echarte un cable; pero de momento mete el código entre los tags [ code ] ... [ /code ] (sin espacios).

PD: Que complicación para recoger los datos :x

Li3cht

#2 Ya está, no sabía eso del code! xD

Como explico, no se me da muy bien esto, intento hacer lo que puedo pero me veo superado, como otras tantas, con este problema :(

VipeR_CS

Bueno lo primero, respecto a lo que te comentaba de la complicación al recoger los datos del teclado, salvo que os lo hayan mandado así específicamente por algún motivo, no es necesario meter letra a letra en el array. Aunque los strings como tal no existen y se tratan como arrays, puedes asignar directamente una cadena a un array como en cualquier otro lenguaje sin complicarte la vida con bucles xD. No lo he probado pero sería algo así:

Edit: no he dicho nada, me había parecido que el bucle era para meter char a char el input en la variable xD

Yo no usaría fgets tampoco pero bueno, eso es lo de menos. Y respecto al problema en sí, punteros habéis dado? O la función strstr al menos?

Thanat0s

Buenas, a ver lo primero de todo y que debes de aprender, es que en un for, no te puedes salir nunca.
Los fors se recorren de inicio a final y usar un break para salirse de un for es un error garrafal que seguramente haga que suspendas.

Si tienes que recorrer algo, pero no sabes hasta donde usa un while.

Luego, la idea del ejercicio es la siguiente:
1) Lees la frase entera
2) Lees la palabra a cambiar
3) Lees la nueva palabra
4) Buscas la palabra a cambiar dentro de la frase, recorriendo el string de principio a fin con un for y guardando en dos auxiliares dónde empieza y dónde termina esa palabra.
Por ejemplo: hola ke tal? (frase)
Palabra a cambiar: ke
Palabra nueva: que
ini=5, fin=6
Haces un strcpy de 0 a 5 y un strcpy de 6 al final de la frase inicial, por lo que te queda:
hola tal?
Esto lo guardas en dos strings auxiliares y luego concatenas (usando strcat):
stringAux1 + palabraNueva + stringAux2
Siendo el resultado: hola que tal?

Y ya está :P

Si ves que no puedes sacarlo puedo hacerte el código en otro momento.

Saludos

Li3cht

Bueno, respecto el break, ese código es del profesor, así que no me lo he inventado yo xD
él nos dijo que en C, cuando se de a notar el \0 como fin de cadena, rompamos el bucle ya que es innecesario continuar si ya tenemos lo que queremos...

respecto al código, como decía, sea la idea igual o algo diferente, no lograré sacarlo, así que si puedes te lo agradecería mucho :P

PD: Entre otras cosas, no tengo un compilador en casa, y en el insti no puedo entrar a MV por culpa del proxy... :(

#3 No hemos dado punteros, y si que hemos dado esa instrucción.

LOc0

Sólo dos apuntes. Compilador de C online (asumo que estás en Windows) ->
http://techcruser.blogspot.com/2007/11/online-c-c-compiler.html

En vez de hacer ese bucle for para quitar el '\n' del final de las cadenas leídas usa esto:

fgets(palabra, N, stdin);
palabra[strlen(palabra)-1]=0;

Salu2 ;)

Thanat0s

#6 ¿Un profesor te ha dicho que te salgas de un for con un break?

Madre del amor hermoso xD

Te dejo un código a ver si consigues que funcione mañana en clase:

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

int main()
{
  char frase[21];
  char paraula[11];
  char paraula2[11];
  char *aux;
  // Pedimos los datos
  printf("Introdueix una frase (max. 20 lletres): ");
  fflush (stdin);
  fgets(frase,21,stdin);
  frase[strlen(frase)-1]='\0';
  printf("Ara... \n");

  printf("Introdueix la paraula a substituir (max. 10 lletres): ");
  fflush (stdin);
  fgets(paraula,11,stdin);
  paraula[strlen(paraula)-1]='\0';

  printf("I finalment.. \n");
  printf("Introdueix la paraula que substituira a l'anterior (max. 10 lletres): ");
  fflush (stdin);
  fgets(paraula2,11,stdin);
  paraula2[strlen(paraula2)-1]='\0';

  aux=strstr(frase,paraula);
  strncpy(aux,paraula2,strlen(paraula2));
  puts(frase);
  return 0;
}
NeB1

Me dá a mi que con esa idea de como tienes que hacer el programa no conseguirás sacarlo.

Te propongo una forma más fácil:

Recorres la frase, te guardas donde empieza la palabra que buscas y su longitud, tras esto escribes en otra variable la frase empezando desde el principio, pero cuando llegas donde debería estar la palabra (te has guardado donde empieza) escribes la sustituta, luego lees tantos caracteres como longitud tenía la palabra sin hacer nada, y luego sigues copiando la frase a la nueva variable

Amazon

#8 Ví unos apuntes de un profesor de una Ingeniería Naval que hizo un programa para calcular nosequé y que usaba break para salir de for en todos y cada uno de los "for"s xDDD

Los apuntes eran de un amigo, yo estaba flipando con tanto break xD

Li3cht

Gracias por lo del compilador L0c0. Thanat0s o alguien me podéis ayudar con el code? :P

Thanat0s

Creo que te funcionará sin problemas, en el compilador online la opción de meter cosas por consola como que no funciona :P

Ale, con esto y un bizcocho.

Li3cht

Muchas gracias Thanat0s, pero tengo una duda.

el puts(frase) qué es?no lo hemos dado - si hay alguna manera de sustituirlo por algo más "novato" pues esto ya es para aplaudirte xD

Thanat0s

El puts es como un printf, usa lo que hayas dado para imprimir la frase y ya está :P

Li3cht

Vale, solucionado. Me he fijado, por último un par de cosas. Y es que el comando strstr no lo hemos visto, me gustaría tener alguna explicación o si se puede modificar al igual que el puts a un código menos elaborado a mi nivel.

El asterisco en (*aux) también me gustaría saber que es, por lo demás, todo entendido! gracias de nuevo por el code

EDIT: Me he fijado que arriba puse que si lo hicimos, pues no, se me ha ido la olla xDD

VipeR_CS

#15 la función strstr() devuelve un puntero con la posición de inicio donde se encuentra la cadena que buscas dentro de la frase. Sería como hacer un bucle para recorrer la frase caracter a caracter y guardar la posición de dónde empieza el término que buscas. Por eso te preguntaba antes si lo habíais dado (y dijiste que sí >.< xD), facilita bastante las cosas, al menos para comprobar siquiera si la palabra que buscas está en la frase, porque como no lo compruebes y sustituyas directamente te va a petar por todos lados al meter una palabra erronea.

Edit: el asterisco es lo otro que te preguntaba, un puntero xD. con char *aux declaras un puntero que apunta a char, pero esto si no lo habéis dado te costará entenderlo.

Edit2: Como te ha comentado Thanat0s, el puts() es prácticamente como el printf. Si lo prefieres simplemente sustitúyelo por esto:

printf("Nueva frase: %s", frase);
Li3cht

Bueno, el código de Thanat0s funciona, pero si la palabra se repite a lo largo de la cadena no. Un compañero me ha estado ayudando (viene de la universidad y entiende) y al final lo hemos sacado.

Muchas gracias igualmente, ya que vuestro code ha dado pie a que me explicara los punteros. Más o menos lo entendí con el ejemplo de los cajones de memoria y eso jeje

#16 Sí, ya lo he cambiado, gracias!

Vefalst

que manera mas complicada de leer de teclado xD, normalmente se usa la funcion scanf y a correr (o al menos yo es la que uso).
Las pocas veces que he usado fgets a sido con ficheros.

NeB1

#17 (viene de la universidad y entiende) -> falacia de autoridad :P (que no digo que no entienda, eh?)

Li3cht

#19 que quieres que te diga? solo quería dar a entender que él ya ha pasado por lo que estamos haciendo y en clase se lo saca con la punta del rabo, easy and fast T_T

VipeR_CS

Al final lo has hecho con punteros o con mil y un bucles? xD

Li3cht

Pues jugando con el strcat y un puntero si no me equivoco. No tengo el code ahora mismo, ya lo colgaré cuando tenga ocasión, ya que quizás se puede mejorar :D

VipeR_CS

Perfecto, me gustaría echarle un ojo a ver cómo has hecho que reemplace más de una ocurrencia.

Usuarios habituales

  • VipeR_CS
  • Li3cht
  • NeB1
  • Vefalst
  • Thanat0s
  • Amazon
  • LOc0