none
diferencia curiosa entre _tcscpy_s y strcpy_s RRS feed

  • Pregunta

  • hola, estoy haciedno algo mal, o esto es normal?

    Esto funciona bien

        PWSTR cadena = (WCHAR *) malloc( 10 * sizeof(WCHAR) +1 );
        _tcscpy_s(cadena, sizeof(WCHAR) * 10, L"Murcielago");

    Pero esto no:

        char* cadenaANSI = (char *) malloc(11);
        strcpy_s(cadenaANSI, 10, "Murcielago");

    y me saca un assert informando que es porque el buffer es insuficiente, con solo poner

        char* cadenaANSI = (char *) malloc(11);
        strcpy_s(cadenaANSI, 11, "Murcielago");

    se arregla, pero se me hae muy raro ya que en mi caso _tcscpy_s se resuelve como wcscpy_s por lo cual se supone que ambas deben funcionar muy similar, pero resulto que para el caso de strcpy_s debo indicar el maxcharacters contanto el caracter de NULL y para el otro el maxcharacters no lo debe tener en cuenta.



    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Mi Blog C# XNA Sistemas Operativos
    sábado, 1 de agosto de 2009 3:19

Respuestas

  • Te has armando la picha un lío, je je.

    La primera sentencia está mal. Debería ser:

      PWSTR cadena = (WCHAR *) malloc( 11 * sizeof(WCHAR) );
        _tcscpy_s(cadena, sizeof(WCHAR) * 11, L"Murcielago");

    Si no falla conforme la has puesto, me temo que hay algo mal en el runtime o que el assert te está saliendo en la ventana de debug de Visual C++.

    Por otro lado, la forma agnóstica en cuanto a ANSI/UNICODE sería:

      TCHAR* cadena = (TCHAR *) malloc( 11 * sizeof(TCHAR) );
       _tcscpy_s(cadena, sizeof(TCHAR) * 11, _T("Murcielago"));

    Así, al menos en Visual C++, te valdrá tanto para UNICODE como para ANSI.



    miércoles, 5 de agosto de 2009 21:03
    Moderador

Todas las respuestas

  • Te has armando la picha un lío, je je.

    La primera sentencia está mal. Debería ser:

      PWSTR cadena = (WCHAR *) malloc( 11 * sizeof(WCHAR) );
        _tcscpy_s(cadena, sizeof(WCHAR) * 11, L"Murcielago");

    Si no falla conforme la has puesto, me temo que hay algo mal en el runtime o que el assert te está saliendo en la ventana de debug de Visual C++.

    Por otro lado, la forma agnóstica en cuanto a ANSI/UNICODE sería:

      TCHAR* cadena = (TCHAR *) malloc( 11 * sizeof(TCHAR) );
       _tcscpy_s(cadena, sizeof(TCHAR) * 11, _T("Murcielago"));

    Así, al menos en Visual C++, te valdrá tanto para UNICODE como para ANSI.



    miércoles, 5 de agosto de 2009 21:03
    Moderador
  • PWSTR cadena = (WCHAR *) malloc( 11 * sizeof(WCHAR) ); _tcscpy_s(cadena, sizeof(WCHAR) * 11, L"Murcielago"); Si no falla conforme la has puesto, me temo que hay algo mal en el runtime o que el assert te está saliendo en la ventana de debug de Visual C++. se arregla, pero se me hae muy raro ya que en mi caso _tcscpy_s se resuelve como wcscpy_s o [url=http://www.toppharmacyonline.com/]Online Pharmacy[/url] por lo cual se supone que ambas deben funcionar muy similar, pero resulto que para el caso de strcpy_s debo indicar el maxcharacters contanto el caracter de NULL y para el otro el maxcharacters no lo debe tener en cuenta.
    viernes, 30 de octubre de 2009 13:31
  • _tcscpy_s es una macro que puede terminar llamando a diferentes funciones del runtime dependiendo de qué juego de caracteres estés usando.
    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    lunes, 2 de noviembre de 2009 12:44
    Moderador