elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pregunta Cadenas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Pregunta Cadenas  (Leído 3,904 veces)
clodan

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Pregunta Cadenas
« 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:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. char sta[50];
  6. int y=0;
  7. main (){
  8.     printf("Ingrese la frase a la cual desea contarle las letras\n");
  9.     scanf("%s",sta);
  10.     while (sta[y]!='\0'){
  11.           y++;
  12.           }
  13.     printf("La frase tiene %d caracteres\n", y);
  14.  
  15.     getchar();
  16.     return 0;
  17. }
  18.  


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Pregunta Cadenas
« Respuesta #1 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):

Código
  1. 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 línea

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
Wiki

Desconectado Desconectado

Mensajes: 290

¡La verdad os hará libres!


Ver Perfil WWW
Re: Pregunta Cadenas
« Respuesta #2 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
« Última modificación: 31 Octubre 2010, 10:25 am por Horricreu » En línea

clodan

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Re: Pregunta Cadenas
« Respuesta #3 en: 26 Agosto 2010, 16:10 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):

Código
  1. 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
En línea

Horricreu
Wiki

Desconectado Desconectado

Mensajes: 290

¡La verdad os hará libres!


Ver Perfil WWW
Re: Pregunta Cadenas
« Respuesta #4 en: 26 Agosto 2010, 16:23 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):

Código
  1. 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
« Última modificación: 31 Octubre 2010, 10:25 am por Horricreu » En línea

Tokes

Desconectado Desconectado

Mensajes: 140


Ver Perfil
Re: Pregunta Cadenas
« Respuesta #5 en: 26 Agosto 2010, 16:30 pm »

Pues con lo que te dijeron todos, tu código corregido es el siguiente:

Código:
#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.
En línea

Horricreu
Wiki

Desconectado Desconectado

Mensajes: 290

¡La verdad os hará libres!


Ver Perfil WWW
Re: Pregunta Cadenas
« Respuesta #6 en: 26 Agosto 2010, 16:33 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.

Citar
Get 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
En línea

clodan

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Re: Pregunta Cadenas
« Respuesta #7 en: 26 Agosto 2010, 16:34 pm »

Listo gente! jejeje muchas gracias =D

me quedo asi el codigo:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. char sta[50];
  6. int y=0;
  7. main (){
  8.     printf("Ingrese la frase a la cual desea contarle las letras\n");
  9.     fgets(sta, sizeof(sta), stdin);
  10.     while (sta[y]!='\0'){
  11.           y++;
  12.           }
  13.     printf("La frase tiene %d caracteres\n", y-1);
  14.     getchar();
  15.     return 0;
  16. }

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'???
En línea

Horricreu
Wiki

Desconectado Desconectado

Mensajes: 290

¡La verdad os hará libres!


Ver Perfil WWW
Re: Pregunta Cadenas
« Respuesta #8 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.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
« Última modificación: 31 Octubre 2010, 10:27 am por Horricreu » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Pregunta Cadenas
« Respuesta #9 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.
En línea

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines