Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda problema sencillo de cadena de caracteres C

Estas en el tema de Duda problema sencillo de cadena de caracteres C en el foro de C/C++ en Foros del Web. Buenas, tengo tiempo sin manejar C y me salen unas cuantas dudas en cadenas. El programa va asi "Escriba un programa que lea una secuencia ...
  #1 (permalink)  
Antiguo 09/06/2014, 21:38
Avatar de Swastik  
Fecha de Ingreso: noviembre-2013
Mensajes: 9
Antigüedad: 10 años, 5 meses
Puntos: 1
Duda problema sencillo de cadena de caracteres C

Buenas, tengo tiempo sin manejar C y me salen unas cuantas dudas en cadenas.

El programa va asi "Escriba un programa que lea una secuencia de caracteres y cuente la frecuencia de un carácter n.La secuencia terminará cuando se lea el carácter punto (.)."

El problema esta en que cuando quiero ver mi vector de caracteres no me lo muestra, ya que el programa termina por la condición del "do... while(ch!='.'); " , me quede estancado en esa parte.


Código:
#include <stdio.h>
#include <string.h>
#include <conio.h>




main() 
{
	
    char caracteres[50];
    char ch;
    int largo,j=0;
    largo=0;

do {

      printf("\nIntroduzca un caracter, para terminar pulse '.' (punto): ");
      scanf("\n%c",&ch);

         caracteres[j] = ch;
         caracteres[j+1]= '\0';
         
}while(ch!='.');    


largo=strlen(caracteres);
     
     for(int i=0;i<largo;i++)
     {
        printf("%s  ",caracteres);
        }     
     
     getch();

}
saludos.
  #2 (permalink)  
Antiguo 09/06/2014, 21:41
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Duda problema sencillo de cadena de caracteres C

Tal vez te convenga incrementar j a medida que lees caracteres.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 10/06/2014, 06:59
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 9 meses
Puntos: 13
Respuesta: Duda problema sencillo de cadena de caracteres C

Buenos días.

Primero antes que todo, normalmente un compilador no debería dejarte compilar el main sin algún tipo de dato definido. (Creo que en C99 si lo permite, pero es muy mala práctica, aún así cuando el compilador sabe que ahí irá un int). El sistema operativo necesita que cada programa devuelva un código, en el POSIX se establece

Código C:
Ver original
  1. #define EXIT_SUCCESS    0
  2. #define EXIT_FAILURE    1

Como te dijeron acá arriba, el problema es que no estás incrementado la variable j.

Código C:
Ver original
  1. caracteres[j+1]= '\0';

Aunque evidentemente aquí la estás incrementado, no estás modificando su contenido, por consecuente, siempre será 0+1.

Otra cosa más, en el momento que tratas de imprimirla,

Código C:
Ver original
  1. largo=strlen(caracteres);
  2.      
  3.      for(int i=0;i<largo;i++)
  4.      {
  5.         printf("%s  ",caracteres);
  6.         }

Estás obteniendo el largo de ella, y luego ¿imprimiendo la variable completa por el tamaño de ésta?, ejemplo. Si colocas en la variable "Hola", te imprimirá "Hola" 4 veces. Si en caso lo que querías hacer era imprimir la variable por caracteres podías hacer

Código C:
Ver original
  1. for (i = 0; i < largo; i++)
  2.     {
  3.         printf("%c", caracteres[i]);
  4.     }    
  5.      
  6.     ó más simple.
  7.  
  8.     printf("%s", caracteres);

Te daré un ejemplo mío de tu código más simple.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main (void)
  5. {
  6.     char buffer[256] = {0};
  7.     unsigned int size;
  8.  
  9.     for (size = 0; size < sizeof (buffer); size++)
  10.     {
  11.         buffer[size] = getchar();
  12.        
  13.         if (buffer[size] == '.') break;
  14.     }
  15.  
  16.     printf("String: %.265s | Size: %d\n", buffer, size++);
  17.  
  18.     return EXIT_SUCCESS;
  19. }

¿Qué diferencia cuenta sobre tu código?, maneja más sencillo la recolección de caracteres y también evitas desbordamientos de buffers que hablé de él, en otro tema (http://www.forosdelweb.com/4499682-post2.html), no es el mismo caso, pero se entiende el objetivo.

Como último, el tema que te recomendé arriba, también hablé de la librería conio.h, échale un vistazo.

Un saludos.
__________________
Si me equivoco, corríjanme sin piedad.
  #4 (permalink)  
Antiguo 10/06/2014, 13:17
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Duda problema sencillo de cadena de caracteres C

Y no es por ir contracorriente, que no, pero Swastik ya que usas la librería conio.h podrías "exprimirla" un poco más y, eso sí, sin que la cadena contenga el punto final ya que considero que éste es sólo para indicar el final de la cadena y no parte de la misma, bajo mi punto de vista claro, acertado, o no vaya usted a saber.....:

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3.  
  4. int main(){
  5.   int j=0;
  6.   char caracteres[50];
  7.   printf("\nIntroduzca una frase, para terminar pulse '.' (punto): ");
  8.   while ((caracteres[j] = getche()) != '.' && j < 50)
  9.     j++;
  10.   caracteres[j]= '\0';
  11.   printf("\ncadena: %s | caracteres: %d\n",caracteres,j);
  12.   return 0;
  13. }

Personalmente soy partidario de no usar "cosas" que no formen parte del estándar del C, es decir usaría getchar en lugar de getche y evitaría con ello el uso de la mencionada librería conio.h, pero no dejo de reconocer que su uso está muy extendido, basta repasar los códigos que se cuelgan en el foro para darse cuenta de ello.

Y me temo que el mal está más en los enseñantes, que no se actualizan, que en los alumnos a los que directamente se les induce a hacer uso de ello. Pero, en fin, eso es ya otra historia.

¡¡¡Saluditos!!!

  #5 (permalink)  
Antiguo 10/06/2014, 16:28
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Duda problema sencillo de cadena de caracteres C

Mejoro sólo un poco más lo que leosansan ofrece:

Una expresion como esta:

Código C:
Ver original
  1. while ((caracteres[j] = getche()) != '.' && j < 50)

considera el j < 50 para que cuando j sea 50 o mas no se esté escribiendo en el arreglo en una posicion más allá de sus límites.

C y C++ funcionan con "corta-circuito": en una secuencia de expresiones separadas por &&, la primera expresion que es falsa hace que el resto no se evalúe, por lo que conviene rotar el chequeo y escribirlo asi:

Código C:
Ver original
  1. while (( j < 50 ) && (caracteres[j] = getche()) != '.' )

con ello, si j es 50 o mas, j <50 será falso, la asignacion que viene a continuacion no intentará hacerse siquiera y no se escribirá en caracteres[50].

En la expresion original, mostrada más arriba, lo primero que se hará será escribir en la posicion 50 para luego comprobar si era posible hacerlo, vale decir, ocurrirá corrupción/sobreescritura de memoria en ese caso.
__________________
Visita mi perfil en LinkedIn

Etiquetas: cadena, caracteres, int, programa, sencillo, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:49.