Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: clodan en 26 Agosto 2010, 15:59 PM

Título: Pregunta Cadenas
Publicado por: clodan en 26 Agosto 2010, 15:59 PM
Wenas... bueno, por lo que estuve viendo de strings en C, el programa C toma un arreglo y le agrega el caracter '\0' atras, lo cual entiendo que es la unica diferencia.

Para practicar estoy tratando de hacer un programa que me diga la cantidad de caracteres que tiene una frase (Incluyendo espacios). Pero al ejecutar el programa solo me cuenta la primer palabra y me ignora todo despues del espacio.

El otro problema que tengo es que me recomendaron dejar de usar los comandos system, y para reemplazar el pause vi que tambien puede usarse el getchar(); Pero cuando llega al punto ese lo esquiva, osea no frena el programa y sale automaticamente...


aca el codigo:

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


char sta[50];
int y=0;
main (){
     printf("Ingrese la frase a la cual desea contarle las letras\n");
     scanf("%s",sta);
     while (sta[y]!='\0'){
           y++;
           }
     printf("La frase tiene %d caracteres\n", y);
     
     getchar();
     return 0;
}
Título: Re: Pregunta Cadenas
Publicado por: Eternal Idol en 26 Agosto 2010, 16:06 PM
scanf no es recomendable, asi tenes mas seguridad (al pasar el tamaño del buffer) y no se ensucia el buffer del teclado (por eso getchar funciona):

fgets(sta, sizeof(sta), stdin);

scanf con %s lee una palabra sola, no es problema del conteo, probalo con fgets y vas a ver como funciona bien. Esto es matar dos pajaros de un tiro  ;D
Título: Re: Pregunta Cadenas
Publicado por: Horricreu en 26 Agosto 2010, 16:09 PM
A parte de lo que te dijo Eternal Idol, ¿por qué incluyes la librería stdlib.h si no la utilizas?

Saludos :P
Título: Re: Pregunta Cadenas
Publicado por: clodan en 26 Agosto 2010, 16:10 PM
Cita de: Eternal Idol en 26 Agosto 2010, 16:06 PM
scanf no es recomendable, asi tenes mas seguridad (al pasar el tamaño del buffer) y no se ensucia el buffer del teclado (por eso getchar funciona):

fgets(sta, sizeof(sta), stdin);

scanf con %s lee una palabra sola, no es problema del conteo, probalo con fgets y vas a ver como funciona bien. Esto es matar dos pajaros de un tiro  ;D

en ese codigo, podrias especificarmelo un poco mas, estoy recien salidito del horno con cadenas y no entiendo una goma
Título: Re: Pregunta Cadenas
Publicado por: Horricreu en 26 Agosto 2010, 16:23 PM
Cita de: clodan en 26 Agosto 2010, 16:10 PM
Cita de: Eternal Idol en 26 Agosto 2010, 16:06 PM
scanf no es recomendable, asi tenes mas seguridad (al pasar el tamaño del buffer) y no se ensucia el buffer del teclado (por eso getchar funciona):

fgets(sta, sizeof(sta), stdin);

scanf con %s lee una palabra sola, no es problema del conteo, probalo con fgets y vas a ver como funciona bien. Esto es matar dos pajaros de un tiro  ;D

en ese codigo, podrias especificarmelo un poco mas, estoy recien salidito del horno con cadenas y no entiendo una goma

fgets() (http://www.cplusplus.com/reference/clibrary/cstdio/fgets/) de la librería stdio.h. Si te fijas en el enlace:


Saludos :P
Título: Re: Pregunta Cadenas
Publicado por: Tokes en 26 Agosto 2010, 16:30 PM
Pues con lo que te dijeron todos, tu código corregido es el siguiente:

#include <stdio.h>
#include <conio.h>

char sta[50];
int y=0;

int main (){
    printf("Ingrese la frase a la cual desea contarle las letras\n");
    fgets(sta, sizeof(sta), stdin);
    while (sta[y]!='\n'){
          y++;
          }
    printf("La frase tiene %d caracteres\n", y);

    getch();
    return 0;
}


La función fgets() guarda al final de la cadena un '\n'. Dicho caracter no es parte en sí del texto tecleado (es el retorno de carro, me parece).

                Saludos.
Título: Re: Pregunta Cadenas
Publicado por: Horricreu en 26 Agosto 2010, 16:33 PM
Cita de: Tokes en 26 Agosto 2010, 16:30 PM
La función fgets() guarda al final de la cadena un '\n'. Dicho caracter no es parte en sí del texto tecleado (es el retorno de carro, me parece).

               Saludos.

CitarGet string from stream

Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or a the End-of-File is reached, whichever comes first.
A newline character makes fgets stop reading, but it is considered a valid character and therefore it is included in the string copied to str.
A null character is automatically appended in str after the characters read to signal the end of the C string.

Saludos :P
Título: Re: Pregunta Cadenas
Publicado por: clodan en 26 Agosto 2010, 16:34 PM
Listo gente! jejeje muchas gracias =D

me quedo asi el codigo:

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


char sta[50];
int y=0;
main (){
    printf("Ingrese la frase a la cual desea contarle las letras\n");
    fgets(sta, sizeof(sta), stdin);
    while (sta[y]!='\0'){
          y++;
          }
    printf("La frase tiene %d caracteres\n", y-1);
    getchar();
    return 0;
}


Lee perfectamente todos los caracteres jejeje ahora... como sabe el programa C cuando es una cadena y cuando un arreglo... osea... como sabe que tiene que poner al final el '\0'???
Título: Re: Pregunta Cadenas
Publicado por: Horricreu en 26 Agosto 2010, 16:44 PM
Me alegro que te vaya bien, pero sigues teniendo errores y cosas a mejorar:


Saludos :P
Título: Re: Pregunta Cadenas
Publicado por: Eternal Idol en 26 Agosto 2010, 16:49 PM
conio.h no es una libreria standard, es totalmente desaconsejado su uso. En este caso getchar es la funcion a usar.

PD. El salto de linea es un caracter.
Título: Re: Pregunta Cadenas
Publicado por: clodan en 26 Agosto 2010, 16:57 PM
Cita de: Horricreu en 26 Agosto 2010, 16:44 PM
Me alegro que te vaya bien, pero sigues teniendo errores y cosas a mejorar:


  • Incluyes la librería stdlib que no es necesaria, tal y como te dije en mi primera respuesta.
  • Declara int main() en vez de main(), si no en algún compilador bueno te dará error.
  • Utilizas variables globales, que no son aconsejables ya que tienen una legibilidad menor, condiciona a que el programa sólo sirva para unos casos determinados, puede producir efectos colaterales y atenta contra uno de los principios de la programación, la programación modular.

Saludos :P


FIXED! =D

aca ta el final

#include <stdio.h>

int main (){
     char sta[50];
     int y=0;
     printf("Ingrese la frase a la cual desea contarle las letras\n");
     fgets(sta, sizeof(sta), stdin);
     while (sta[y]!='\0'){
           y++;
           }
     printf("La frase tiene %d caracteres\n", y-1);
     getchar();
     return 0;
}