Duda tonta en C, pero me está matando xD

M

Hola, estoy haciendo un código de principiante en C (es loq eu hay, estoy empezando xD) que se supone que tiene que buscar un caracter en un string y cambiarlo por otro. Mi problema es que en el main cuando va a hacer el scanf de car3 se lo salta y lo inicializa a 0, al contrario que con car4 que sí que me deja inicializarlo por teclado y no sé porqué cojones pasa xD. El código es este:

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

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

void ReemplazarCaracter(char *cadena, char car1, char car2, int *numero){
	while(*cadena!='');
	if (*cadena == car1){
		*cadena=car2;
		cadena++;
		*numero++;
		}
	else cadena++;
	printf("La cadena ahora es %s con un número de cambios %dn", cadena, numero);
}
void main(){
	char car3, car4, cadenas[15];
	int num=0;
	printf("Introduzca una cadena de caracteres: n");
	scanf("%s", cadenas);
	printf("Introduzca un caracter a buscar: n");
	scanf_s("%c", &car3);
	printf_s("Introduzca un caracter para sustituir: n");
	scanf("%c", &car4);
	ReemplazarCaracter(cadenas, car3, car4, &num);
	}
	

Muchas gracias por adelantado! (Cada Smiley " ), salto de línea, que no sé como hacer para que salgan bien xD)

dr_Rouman

En uno pones scanf_s y en el otro no, en mi vida he tenido que usar eso por cierto xDD

Usa la etiqueta

B

Es una implementación del printf que evita el buffer overflow.

M

Lo del scanf_s es que me ponía un warning y lo he puesto, para ver si el error venía de ahí, pero vamos, da igual xD Y lo de la implementación del printf, sí, pero mi pregunta es, ¿cómo puedo hacer para evitarlo? xD Gracias!

maRc

Las funciones que llevan la coletilla _s son en teoría seguras y se recomienda su uso, ya que las tradicionales no lo son, por eso el compilador (supongo que usarás el VC) te da el warning.

Pero sinceramente, para programas chorras de principiante, utiliza las de siempre, que no va a pasar nada.

BrUn

mm lo del scanf no se porque pasa, yo de C también tengo poca idea.

Pero en la función de remplazar el carácter, ese while no terminará nunca, siempre comparas el mismo carácter.

NeB1

Doy por hecho que en esa variable te está introduciendo el salto de linea que has introducido en el scanf anterior, eso se solucionaba con la función esta que vacía el buffer de entrada...

fflush(stdin);

(metelo justo antes de cada scanf)

M

Ostiaaaa, el fkush, mira que nos lo dijo el profesor pero se me había olvidado, muchas gracias!!!! ^^

NeB1

#8 jejeje, suele pasar. otro truco, si no tubieras la libreria necesaria para usar fflush(stdin) es poner:

while(getchar()!='\n'); antes de cada scanf.

Saludos!!

explicacion
1
SCORPIA_VVA

efectivamente neb1 lleva razon fflush(stdin)limpia la variable de tipo stream, utilizala siempre para ese tipo de variables. suerte

M

Muchas gracias por la respuesta de verdad, me ha quedado más claro imposible xD

Lo malo es que ahora me pasa otra cosa, que no me salta a ReemplazarCaracter. ¿Por qué pasa dios santo? xD

PD: también he arreglado la comparación del while de dentro de reemplazar caracter, ahora pone while(*cadena!='\0')

Muchas gracias!!

NeB1

Te faltará la cabecera de la función no?


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

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

void ReemplazarCaracter(char *cadena, char car1, char car2, int *numero);

void main(){
	char car3, car4, cadenas[15];
	int num=0;
	printf("Introduzca una cadena de caracteres: n");
	scanf("%s", cadenas);
	printf("Introduzca un caracter a buscar: n");
	scanf_s("%c", &car3);
	printf_s("Introduzca un caracter para sustituir: n");
	scanf("%c", &car4);
	ReemplazarCaracter(cadenas, car3, car4, &num);
}
	
void ReemplazarCaracter(char *cadena, char car1, char car2, int *numero){
	while(*cadena!='');
	if (*cadena == car1){
		*cadena=car2;
		cadena++;
		*numero++;
		}
	else cadena++;
	printf("La cadena ahora es %s con un número de cambios %dn", cadena, numero);
}

No lo tengo muy claro, pero weno, prueba a borrar todo lo que hay dentro de ReemplazarCaracter y deja un printf("mierda") en el caso de que no sea lo anterior.

M

Vale, nada, era un problema de instalación del Visual Studio, ya va todo perfecto, muchas gracias a todos!! ^^

26 días después
B

lol

JuAn4k4

#14 es C no C++
ya editaste creo :S

Cambiandolo por esto funcionara
scanf("%s\n", &cadena);

J4cKs

en vez de ponerlo en el scanf tmb lo pudes poner en el printf
printf("\nHOLA" );

1 año después
Idontknow

Lo revivo porque buscando por google me ha salido esto y tengo la misma duda aunque lo he probado y no se me resuelve.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define MAXMOST 3
#define N 6
#define NCICLOS 5
//Structura de dades
typedef struct//creo un nou tipus de variable//
{
	int fila;
	int colum;
}posicio;
//Declaració de funcions que usem
void Printmap(char map[N][N]);
int cambi_col(char lloc[2]);
int cambi_fil(char lloc[2]);
posicio Iniciar(posicio jugador , char map[N][N], int count);/*posicio final,posicio monstre[M],*/
posicio Moure(posicio jugador, char map[N][N], int contador);//moure personatge//
posicio Moure_monstre(posicio comodin, char map[N][N]);

//MAIN
int main()
{
    int count=0, i=0,contador=0;
    posicio jugador, final, monstre[MAXMOST], comodin;
    char map[N][N]={{' ','A','B','C','D','E'},
                    {'5','-','-','-','-','X'},
                    {'4','-','-','-','X','-'},
                    {'3','-','X','-','X','-'},
                    {'2','-','-','-','-','-'},
                    {'1','X','-','X','-','-'}};

Printmap(map);//Imprimir situacio del joc
//Inici
printf("Punt d'Inici\n");
jugador= Iniciar(jugador, map, count);//posicionar el jugador
Printmap(map);//Imprimir situacio del joc
count++;
//Final
fflush( stdin );
printf("Punt Final\n");
final=Iniciar(final, map, count);
Printmap(map);
count++;
//Monstes
fflush( stdin );
printf("On vols que apareixin els monstres?");
monstre[i]=Iniciar(comodin, map, count);
count++;
Printmap(map);

while(jugador.fila!=final.fila && jugador.colum!=final.colum ) //moures fins el final
{
    jugador=Moure(jugador, map, contador);

    if(contador==NCICLOS || contador==2*NCICLOS || contador == MAXMOST*NCICLOS)
    {
        i++;
        comodin= monstre[i];
        monstre[i]=Moure_monstre(comodin, map);
        Printmap(map);

    }
    Printmap(map);
}
}
void Printmap(char map[N][N])
{
    int i,j;
    for (i=0;i<N;i++)
    {
		for(j=0;j<N;j++)
        {
            printf("%c ",map[i][j]);
        }
		printf ("\n");
    }
    printf ("\n");
}
posicio Iniciar(posicio comodi, char map[N][N], int count)
{
    //int cont;
    char lloc[2];
    int a, b;
    while(!comodi.fila || !comodi.colum)
    {
        fflush( stdin );
        printf("Introdueix la posició \n");
        fflush( stdin );
        scanf("\n%s", &lloc);
        a=cambi_fil(lloc);
        b=cambi_col(lloc);

    if(map[a][b]=='-')  //TODO transformacio
    {
        if(count==0)
        {
            map[a][b]='O';
        }
        if(count==1)
        {
            map[a][b]='D';
        }
        if(count>1)
        {
            map[a][b]='M';
        }
        comodi.fila= a;
        comodi.colum= b;
    }
    else
        printf("No es pot aqui\n");
}
return comodi;

}
posicio Moure(posicio jugador, char map[N][N],int contador)
{
    int bolea=0, fil=0, col=0, f, c;;
    do
    {
        fil=0;
        col=0;
        f=0;
        c=0;
        char dir;
        fflush( stdin );
        printf("Clica una tecla per mouret\n");
        fflush( stdin );
        scanf("\n%c", &dir);

    switch(dir)
    {
         case 'a'://dalt
              fil--;
              break;
         case 'b'://baix
              fil++;
              break;
         case 'd'://dreta
              col++;
              break;
         case 'i'://esquerra
              col--;
              break;
    }
    f = jugador.fila + fil;
    c = jugador.colum + col;

    if(map[f][c]=='-'|| map[f][c]=='D')
    {
        map[jugador.fila][jugador.colum]='-';
        map[f][c]='O';
        jugador.fila= f;
        jugador.colum= c;
        bolea=1;
        return jugador;
        if(map[f][c]=='D')
        {
            printf("YOU WIN!!!\n");
        }
    contador++;
    }
    else
    {
        printf("El moviment no es correcte, torna-ho a intentar\n");
        bolea=0;
    }

}while(bolea==0);
}
posicio Moure_monstre(posicio comodin, char map[N][N]) //TODO
{
    int bolea=0, fil=0, col=0, f, c,a;
    do
    {
        fil=0;
        col=0;
        f=0;
        c=0;
        srand((unsigned)time(NULL));
        a=rand() % 4;
        switch(a)
        {
             case '0'://dalt
                  fil--;
                  break;
             case '1'://baix
                  fil++;
                  break;
             case '2'://dreta
                  col++;
                  break;
             case '3'://esquerra
                  col--;
                  break;
        }
        f = comodin.fila + fil;
        c = comodin.colum + col;

    if(map[f][c]=='-' || map[f][c]=='M')
    {
        map[comodin.fila][comodin.colum]='-';
        map[f][c]='M';
        comodin.fila= f;
        comodin.colum= c;
        bolea=1;
        return comodin;
    }
    else
    {
        bolea=0;
    }

}while(bolea==0);

}

int cambi_col(char lloc[2])
{
    int a;
    switch(lloc[1])
    {
     case 'a':
          a=1;
          break;
     case 'b':
          a=2;
          break;
     case 'c':
          a=3;
          break;
     case 'd':
          a=4;
          break;
     case 'e':
          a=5;
          break;
    }
    return a;
}
int cambi_fil(char lloc[2])
{
    int a;
    switch(lloc[0])
    {
     case '1':
          a=5;
          break;
     case '2':
          a=4;
          break;
     case '3':
          a=3;
          break;
     case '4':
          a=2;
          break;
     case '5':
          a=1;
          break;
    }
    return a;
}

Me compila bien pero cuando lo ejecuto me salta los scans y va a su bola.

r2d2rigo
scanf("\n%c", &dir);

Escaneas un \n? Eso es un poco raro no?

Y los fflush van inmediatamente despues de un scanf, para eliminar los datos no leidos, no hace falta que pongas tantos.

1 respuesta
Idontknow

#18 Gracias. He puesto el \n porque nos dijeron que más de una vez daba error y eso lo arreglaba.

#18 La cosa sigue igual...

1 respuesta
r2d2rigo

Se salta todos? Prueba a usar getchar() en lugar de scanf("%c").

SikorZ

#19 Prueba con gets(nombrevariable);

1 respuesta
Idontknow

#21 Tambien lo probe... y nada... Bueno ya he entragado el trabajo que se tenia que entragar hoy antes de las 9am. A ver que nota me ponen...

1 respuesta
SikorZ

#22 un 11 seguro:D.

1 respuesta
Idontknow

#23 Lo dudo xD

Usuarios habituales