sprintf_s не удалось в режиме выпуска, и нормально в отладке

0

В C++, с VS2012, я хотел бы получить адрес Mac и преобразовать его в форматирование автомобиля. Я использую функцию sprintf_s() для преобразования в режим автомобиля. В режиме отладки все в порядке, но в режиме деблокирования функция sprint_s не выполняется должным образом! Кажется, он выходит из моей программы!

Я не знаю почему!

Кто-нибудь может мне помочь?

Вот небольшой пример, который демонстрирует мою проблему. Я тестировал на отдельных ПК:

#include "stdafx.h"
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "iphlpapi.lib")
#define MACADDR_SIZE (6*3)


#define MAC_DIM                 6
#define MACHINE_CODE_DIM        6
#define SOFTWAREKEY_DIM         6

enum RETVALUE
{
    SUCCESS,
    ERROR_API_CALL_FAILED,
    ERROR_FAILURE_WHILE_LOADING_LIBRARY,
    ERROR_OS_VERSION_NOT_SUPPORTED,
    ERROR_SOFTWAREKEY_NOT_FOUND,
    ERROR_CONVERSION_CHAR_2_WCHAR_FAILED
};



int _tmain(int argc, _TCHAR* argv[])
{

    char * mac_addr = (char*)malloc(MACADDR_SIZE + 1);

    // Declare and initialize variables
    DWORD dwSize = 0;
    DWORD dwRetVal = 0;
    int i = 0;
    ULONG flags, outBufLen = 0, family;
    LPVOID lpMsgBuf;
    PIP_ADAPTER_ADDRESSES pAddresses;
    PIP_ADAPTER_ADDRESSES pCurrAddresses;
    PIP_ADAPTER_UNICAST_ADDRESS pUnicast;
    PIP_ADAPTER_ANYCAST_ADDRESS pAnycast;
    PIP_ADAPTER_MULTICAST_ADDRESS pMulticast;
    IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;
    IP_ADAPTER_PREFIX *pPrefix = NULL;

    // Set the flags to pass to GetAdaptersAddresses
    flags = GAA_FLAG_INCLUDE_PREFIX;
    // default to unspecified address family (both)
    family = AF_UNSPEC;
    lpMsgBuf = NULL;
    pAddresses = NULL;

    pCurrAddresses = NULL;
    pUnicast = NULL;
    pAnycast = NULL;
    pMulticast = NULL;

    family = AF_INET;

    outBufLen = sizeof (IP_ADAPTER_ADDRESSES);
    pAddresses = (IP_ADAPTER_ADDRESSES *)malloc(outBufLen);
    if (pAddresses == NULL)
    {
        printf("Memory allocation failed for IP_ADAPTER_ADDRESSES struct!\n");
        exit(1);
    }
    else
        printf("Memory allocation for IP_ADAPTER_ADDRESSES struct is OK!\n");

    // Make an initial call to GetAdaptersAddresses to get the
    // size needed into the outBufLen variable
    if (GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW)
    {
        printf("Not enough buffer! Re-allocating...\n");
        free(pAddresses);
        pAddresses = (IP_ADAPTER_ADDRESSES *)malloc(outBufLen);
    }
    else
        printf("Buffer allocation is OK!\n");

    if (pAddresses == NULL)
    {
        printf("Memory allocation failed for IP_ADAPTER_ADDRESSES struct!\n");
        exit(1);
    }
    else
        printf("Memory allocation for IP_ADAPTER_ADDRESSES struct is OK!\n");

    // Make a second call to GetAdapters Addresses to get the actual data we want
    printf("Memory allocated for GetAdapterAddresses = %d bytes\n", outBufLen);
    printf("Calling GetAdaptersAddresses function with family = ");
    if (family == AF_INET)
        printf("AF_INET\n");

    dwRetVal = GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);

    if (dwRetVal == NO_ERROR)
    {
        // If successful, output some information from the data we received
        pCurrAddresses = pAddresses;

        if (pCurrAddresses->PhysicalAddressLength != 0)
        {
            printf("\tPhysical address: ");
            for (i = 0; i < (int)pCurrAddresses->PhysicalAddressLength; i++)
            {
                if (i == (pCurrAddresses->PhysicalAddressLength - 1))
                    printf("%.2X\n", (int)pCurrAddresses->PhysicalAddress[i]);
                else
                    printf("%.2X-", (int)pCurrAddresses->PhysicalAddress[i]);
            }
        }

        sprintf_s(mac_addr, MACADDR_SIZE + 1, "%c%c%c%c%c%c",
            pCurrAddresses->PhysicalAddress[0], pCurrAddresses->PhysicalAddress[1],
            pCurrAddresses->PhysicalAddress[2], pCurrAddresses->PhysicalAddress[3],
            pCurrAddresses->PhysicalAddress[4], pCurrAddresses->PhysicalAddress[5]);

        printf("Mac adress in car formatting is :");
        printf(mac_addr);   
        getchar();
        free(pAddresses);

    }

    return 0;
}

Большое спасибо :)

С наилучшими пожеланиями,

Nixeus

  • 0
    Ваш код работает в отладке и выпуске для меня. Тем не менее, он печатает бред, поскольку значения в массиве не являются обычными печатными символами. Вы использовали отладчик, чтобы увидеть, что происходит? Вы не проверяете возвращаемое значение из sprintf_s поэтому я не уверен, как вы определили, в чем проблема. Это вызывает неверный обработчик параметра?
Теги:
visual-c++
visual-studio-2010
printf

1 ответ

2
Лучший ответ

Вы не можете использовать %c для печати байтов MAC-адреса, так как эти байты не могут быть печатными символами.

Код, который printf "Физический адрес", используя %.2X является тем, который нужно использовать.

Ваш код хорошо работает в режиме отладки или выпуска для меня (VS2012), но поскольку мой первый NIC имеет 0x00 в качестве первого байта, окончательный printf ничего не печатает.

  • 0
    Хорошо, мне нужно преобразовать мой MAC-адрес в символы в символе *, чтобы генерировать уникальный идентификатор для расчета серийного ключа. Вопрос заключается в следующем: если первый байт 0x00, это может создать проблемы в функции sprintf_s? Как я могу преобразовать MAC-адрес в символе, который имеет 0x00 в качестве первого байта? Спасибо
  • 0
    Обычный способ преобразования MAC-адреса в строку символов заключается в использовании формата «01-de-ad-99-00-42» (6 байтов печатаются как шестнадцатеричные значения, разделенные дефисом). См. En.wikipedia.org/wiki/MAC_address. Нет проблем с передачей нулевого байта, соответствующего% c, в printf_s.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню