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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda sobre el control de la longitud de una cadena de caracteres
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre el control de la longitud de una cadena de caracteres  (Leído 1,943 veces)
seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Duda sobre el control de la longitud de una cadena de caracteres
« en: 16 Agosto 2015, 20:59 pm »

Buenas a todos, tengo una duda.

Si tengo las dimensiones de una cadena de caracteres...

Código
  1. char cadena1[80]
  2.  

... e introduzco por ejemplo en cadena1: "El pajaro vuela", el caracter nulo "\0" estaría inmediatamente después de vuela\0 o estaría en la posición 80 de cadena1 por haber definido su tamaño previamente?

PD: Es que en un ejericio me salen datos basura... no se qué estoy haciendo mal.
Os dejo el código. El main ya venía hecho.

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. typedef char TCadena [];
  5.  
  6. // Funciones para modificar cadenas de caracteres ----------------------
  7.  
  8. unsigned longitud (const TCadena cad);
  9.  
  10. void copiar(TCadena destino, const unsigned dim, const TCadena origen,
  11.                                                              bool& ok);
  12. // Copia los caracteres de la cadena origen en la cadena destino de
  13. // tamañoo dim. Devuelve false en ok si no tiene capacidad suficiente
  14.  
  15. void agregar_char(TCadena destino, const unsigned dim, const char c,
  16.                                                           bool& ok);
  17. // Agrega el carácter c al final de la cadena destino.
  18. // Devuelve ok a false cuando no tiene capacidad suficiente
  19.  
  20. void encadenar(TCadena destino, const unsigned dim,
  21.                                 const TCadena origen, bool& ok);
  22. // Agrega todos los caracteres de la cadena origen al final de la cadena
  23. // destino. Devuelve ok a false cuando no tiene capacidad suficiente
  24.  
  25.  
  26. //- Programa de prueba -------------------------------------------------
  27.  
  28. int main(){
  29.    setlocale(LC_ALL, "spanish");
  30.  
  31.    char cadena1[80], cadena2[80];
  32.    char c;
  33.    bool ok;
  34.  
  35.    cout << "Introducir una cadena:\n";
  36.    cin >> ws;
  37.    cin.getline(cadena1,79);
  38.  
  39.    cout << "Introducir un carácter: ";
  40.    cin >> c;
  41.    agregar_char(cadena1, 80, c, ok);
  42.    if(ok){
  43.      cout << "Al agregarle el carácter la cadena queda:\n";
  44.      cout << cadena1 << endl;
  45.    } else {
  46.      cout << "No hay espacio para agregar un carácter\n";
  47.    }
  48.  
  49.    copiar(cadena2, 80, cadena1, ok);
  50.    if (ok){
  51.          cout << "La cadena copiada es: \n";
  52.          cout << cadena2 << endl;
  53.    } else {
  54.          cout << "No hay espacio para la copia" << endl;
  55.    }
  56.  
  57.    cout << "Pegando las dos cadenas resulta: \n";
  58.    encadenar(cadena2, 80, cadena1, ok);
  59.    if (ok){
  60.          cout << cadena2 << endl << endl;
  61.    } else {
  62.          cout << "No hay espacio para encadenar" << endl;
  63.    }
  64.  
  65.    cout<<longitud(cadena2);
  66.    return 0;
  67. }
  68.  
  69. //- Definiciones de funciones ------------------------------------------
  70.  
  71. unsigned longitud (const TCadena cad){
  72.    unsigned pos=0;
  73.    while (cad[pos]!='\0') ++pos;
  74.    return pos;
  75. }
  76.  
  77.  
  78. void copiar(TCadena destino, const unsigned dim, const TCadena origen, bool& ok){
  79.    if(longitud(origen)<=dim){
  80.        ok=true;
  81.        unsigned i=0;
  82.        while(origen[i]!='\0'){
  83.            destino[i]=origen[i];
  84.            ++i;
  85.        }//end while
  86.    }else ok=false;
  87. }
  88.  
  89. void agregar_char(TCadena destino, const unsigned dim, const char c, bool& ok){
  90.        if(longitud(destino)<dim){
  91.            destino[longitud(destino)]=c;
  92.             ok=true;
  93.        }else ok=false;
  94. }
  95.  
  96. void encadenar(TCadena destino, const unsigned dim, const TCadena origen, bool& ok){
  97.    if(longitud(origen)>dim-longitud(destino)){
  98.        unsigned i=longitud(destino)+1;
  99.        unsigned pos=0;
  100.        while(origen[pos]!='\0'){
  101.            destino[i]=origen[pos];
  102.            ++i;
  103.        }//end while
  104.        ok=true;
  105.    }else ok=false;
  106. }
  107.  



« Última modificación: 16 Agosto 2015, 21:13 pm por seryioo » En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: Duda sobre el control de la longitud de una cadena de caracteres
« Respuesta #1 en: 16 Agosto 2015, 23:56 pm »

El carácter \0 estaría despues del último char leído, no en la posición 80.

Los carácteres basura seguramente es porque en la función agregar_caracter machacas el '\0' en la línea
Código:
destino[longitud(destino)]=c;
Y por tanto si los siguientes bytes son basura y no son \0, los imprimira. La manera más fácil es añadir un '\0' despues de modificar la cadena.
Si tenías la cadena "Vuela\0" y añades el caracter 'D', lo que estas haciendo es reemplazar el \0 por la D y queda "VuelaD", lo que tendría que pasar es que añade la 'D' entre la 'a' y el '\0' para que quede "VuelaD\0"

Espero haber ayudado, saludos


En línea

seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Re: Duda sobre el control de la longitud de una cadena de caracteres
« Respuesta #2 en: 17 Agosto 2015, 10:22 am »

Buenas, gracias por tu respuesta.

He arreglado eso que dices, pero sigo teniendo el mismo error:

Código
  1. void agregar_char(TCadena destino, const unsigned dim, const char c, bool& ok){
  2.        if(longitud(destino)<dim){
  3.            destino[longitud(destino)]=c;
  4.             destino[longitud(destino)+1]='\0';
  5.             ok=true;
  6.        }else ok=false;
  7. }

PD:

Lo he arreglado, me he dado cuenta que al añadir el caracter la longitud de destino aumenta, por lo que guardo la longitud inicial para usarla correctamente despues, donde añado \0

Código
  1. void agregar_char(TCadena destino, const unsigned dim, const char c, bool& ok){
  2.        unsigned i=longitud(destino);
  3.        if(longitud(destino)<dim){
  4.            destino[i]=c;
  5.             destino[i+1]='\0';
  6.             ok=true;
  7.        }else ok=false;
  8. }


Sigue sin funcionarme la función "encadenar". A ver si consigo encontrar el error y corregirla.

Código
  1. void encadenar(TCadena destino, const unsigned dim, const TCadena origen, bool& ok){
  2.    unsigned lor=longitud(origen);
  3.    unsigned ldes=longitud(destino);
  4.    if(lor+ldes<=dim){
  5.        ok=true;
  6.        unsigned i=0;
  7.        while(origen[i]!='\0'){
  8.            destino[ldes+i]=origen[i];
  9.            ++i;
  10.        }//end while
  11.        destino[i]='\0';
  12.    } ok=false;
  13. }
« Última modificación: 17 Agosto 2015, 10:43 am por seryioo » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda de cadena de caracteres en C « 1 2 »
Programación C/C++
Ixcal 13 6,299 Último mensaje 28 Septiembre 2012, 23:05 pm
por leosansan
[DUDA] Cadena de caracteres
Scripting
syncro_7 1 1,763 Último mensaje 16 Noviembre 2015, 05:37 am
por yMk369
Duda sobre problema de cadena de caracteres.
Programación C/C++
rafacg96 1 1,460 Último mensaje 2 Diciembre 2015, 07:11 am
por class_OpenGL
Duda sobre cadena de caracteres
Programación C/C++
Mika_50 5 2,209 Último mensaje 21 Enero 2016, 22:44 pm
por Orubatosu
Invertir cadena de carácteres sobre si misma con punteros
Programación C/C++
dailia__ 2 3,910 Último mensaje 10 Mayo 2018, 08:24 am
por dailia__
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines