Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Manejar variable (https://www.clubdelphi.com/foros/showthread.php?t=96965)

REHome 02-11-2024 10:19:13

Manejar variable
 
Buenas:

Me da error de este código:

Error C4996 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

El código es en C++ nativo:
Código:

#include <iostream>
#include <windows.h> // Para mostrar texto en el título de la ventana.
#include <stdio.h>
#include <string.h>

using namespace std;

int main()
{
    char lectura[50] = { 0 };
    // Supongamos que has recibido datos y n es el número de bytes leídos.

    int n = 20; // Por ejemplo, supongamos que leíste 20 bytes.

    strncpy(lectura, "ON - Led encendido.", sizeof(lectura) - 1); // Simulando la lectura.

    lectura[n] = '\0'; // Asegúrate de terminar la cadena.

    // Ahora puedes comparar la cadena.
    if (strcmp(lectura, "ON - Led encendido.") == 0)
    {
        cout << "Recibido: " << lectura << endl;
    }
    else
    {
        cout << "No se recibió el mensaje esperado." << endl;
    }

    return 0;
}

¿Alguna idea?

Saludos.

navbuoy 02-11-2024 11:34:25

has probado a usar strcpy ? (pero recuerda que strcpy acepta puntero a char solamente)

Código:

strcpy(lectura, "ON - Led encendido."); // Simulando la lectura.

navbuoy 02-11-2024 15:21:43

lo que no entiendo muy bien es porque haces esto:

Código:

lectura[n] = '\0'; // Asegúrate de terminar la cadena.
ya que los bytes leidos no deberian ir en la variable de cadena que es donde almacenas el mensaje.

escafandra 02-11-2024 22:14:02

El código mostrado en si mismo es inútil, parece tomado de un fragmento de ejemplo.

En principio muestra un buffer de cadena llamado lectura con tamaño 50.

lectura[n] = '\0' sólo sirve para asegurar que si la cadena llega a tener n caracteres, el último sea un nulo, es una exigencia de las cadenas C, pero n sebe ser menor que 50 (máximo tamaño del buffer) En este caso, asegúrate que el caracter n-1 es el último no nulo.

El error mostrado es un aviso sobre la función strncpy. Esta función realiza una copia de una cadena a otra con un número máximo de caracteres copiados o hasta el final de la cadena a copiar si no se alcanza el límite. Si ponemos un límite mayor a 50 tendremos un desbordamiento. El aviso sugiere que lo desactives o que uses la función strncpy_s que pide también el tamaño de la cadena destino y es más segura. ¿Qué compilador estás usando?

Cuando no se sabe de antemano el tamaño de la cadena buffer, es buena idea asignarle uno grande y controlar que no se desborda o asignarlo dinámicamente una vez que se conozca.

Si se supone que vas a recibir n caracteres, reserva dinámicamente un buffer de n+1 caracteres (el último debe ser cero) y usa una función tipo strncpy o strncpy_s para asegurar que no vas a sobrepasar el límite. Al terminar, recuerda liberar la memoria asignada si fue dinámica.



Saludos.


La franja horaria es GMT +2. Ahora son las 21:45:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi