Pregunta Cadenas

Iniciado por clodan, 26 Agosto 2010, 15:59 PM

0 Miembros y 1 Visitante están viendo este tema.

clodan

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;
}

Eternal Idol

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
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Horricreu

#2
A parte de lo que te dijo Eternal Idol, ¿por qué incluyes la librería stdlib.h si no la utilizas?

Saludos :P

clodan

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

Horricreu

#4
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() de la librería stdio.h. Si te fijas en el enlace:


  • El primer parámetro es un puntero a una matriz, donde se almacenará lo escrito por teclado.
  • El segundo parámetro es el máximo de caracteres que van a ser leídos incluyendo el carácter nulo. Por lo tanto, se le pasará la longitud de la matriz del primer parámetro usando el operador sizeof() .
  • El tercer parámetro es de entrada, por lo tanto se tiene que poner stdin que viene que standard input o entrada standard.

Saludos :P

Tokes

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.

Horricreu

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

clodan

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'???

Horricreu

#8
Me alegro que te vaya bien, pero sigues teniendo errores y cosas a mejorar:


  • Incluyes la librería stdlib.h 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

Eternal Idol

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón