usar resueltos lenguaje leer funciones ejercicios ejemplos como caracteres cadenas cadena arreglo c string cstring null-terminated

resueltos - funciones de cadenas de caracteres en c++



matriz de cadenas con carácter de basura al final (7)

Como Buffer no se inicializa, comienza con los 9 valores de basura. A partir de la salida observada, los elementos segundo, tercero, cuarto, quinto, sexto, séptimo, octavo y segundo inmediato inmediato (fuera de la matriz) son claramente ''T'' , ''T'' , ''W'' , ''/0'' , ''/0'' , ''='' , ''/0'' , ''/0'' , ''/0'' .

Las cadenas consumen todos los caracteres hasta que vean el carácter NULL. Es por eso que, en cada iteración, cuando los elementos de la matriz se asignan uno por uno, el búfer se imprime hasta la parte donde está presente un NULL de basura.

Es decir, la cadena tiene un comportamiento indefinido si la matriz de caracteres no termina con ''/0'' . Puede evitar esto teniendo un espacio adicional para ''/0'' al final del búfer.

Tengo un búfer de matriz char que estoy usando para almacenar caracteres que el usuario ingresará uno por uno. Mi código a continuación funciona pero tiene algunas fallas técnicas que no puedo entender:

  1. cuando ejecuto un printf para ver lo que hay en Buffer, se llena pero obtengo caracteres basura al final
  2. no se detendrá a 8 caracteres a pesar de haber sido declarado como Char Buffer [8];

¿Puede alguien por favor explicarme qué está pasando y quizás cómo podría solucionarlo? Gracias.

char Buffer[8]; //holds the byte stream int i=0; if (/* user input event has occurred */) { Buffer[i] = charInput; i++; // Display a response to input printf("Buffer is %s!/n", Buffer); }

Salida:

tagBuffer is 1┬┬w! tagBuffer is 12┬w! tagBuffer is 123w! tagBuffer is 1234! tagBuffer is 12345! tagBuffer is 123456=! tagBuffer is 1234567! tagBuffer is 12345678!

¡tagBuffer es 123456789!


Lo único que está pasando a la función printf () es un puntero al primer carácter de su cadena. printf () no tiene forma de saber el tamaño de su matriz. (Ni siquiera sabe si es una matriz real, ya que un puntero es solo una dirección de memoria).

printf () y todas las funciones estándar de cadena c suponen que hay un 0 al final de su cadena. printf (), por ejemplo, seguirá imprimiendo caracteres en la memoria, empezando por el carácter que pase a la función, hasta que llegue a 0.

Por lo tanto, debe cambiar su código a algo como esto:

char Buffer[9]; //holds the byte stream int i=0; if( //user input event has occured ) { Buffer[i] = charInput; i++; Buffer[i] = 0; // You can also assign the char ''/0'' to it to get the same result. // Display a response to input printf("Buffer is %s!/n", Buffer); }


Si está programando en C o C ++, debe recordar que: 1) las cadenas terminan con un carácter / 0. 2) C no tiene control de límite en las cadenas, solo son matrices de caracteres.


También es posible que desee considerar el uso de un stringstream .


Tienes que terminar la cadena con un carácter / 0. Es por eso que se llaman cadenas terminadas en cero.

También es aconsejable asignar 1 char adicional para mantener el / 0.


Es extraño que nadie haya mencionado esta posibilidad:

char Buffer[8]; //holds the byte stream int i = 0; while (i < sizeof(Buffer) && (charInput = get_the_users_character()) != EOF) { Buffer[i] = charInput; i++; // Display a response to input printf("Buffer is %.*s!/n", i, Buffer); }

Esta notación en la cadena de formato printf () especifica la longitud máxima de la cadena que se mostrará, y no requiere la terminación nula (aunque la terminación nula es, en última instancia, la mejor manera de hacerlo, al menos una vez que abandona este ciclo).

El ciclo while es más plausible que un simple if , y esta versión garantiza que no se desborde el final del búfer (pero no garantiza que deje suficiente espacio para un NUL posterior ''/0'' . Si desea manejar eso, use sizeof(Buffer) - 1 y luego agregue el NUL después del bucle.


Además de los comentarios anteriores sobre la terminación cero, también debe aceptar la responsabilidad de no desbordar su propio búfer. ¡No se detiene en 8 caracteres porque tu código no se detiene! Necesitas algo como lo siguiente (aprovechando la sugerencia de Jeremy):

#define DATA_LENGTH 8 #define BUFFER_LENGTH (DATA_LENGTH + 1) char Buffer[BUFFER_LENGTH]; //holds the byte stream int charPos=0; //index to next character position to fill while (charPos <= DATA_LENGTH ) { //user input event has occured Buffer[i] = charInput; Buffer[i+1] = ''/0''; // Display a response to input printf("Buffer is %s!/n", Buffer); i++; }

En otras palabras, asegúrese de dejar de aceptar datos cuando se haya alcanzado la longitud máxima, independientemente de lo que el entorno intente presionar.