1、感觉程序没啥 问题 ,结果一运行,一大堆问题,都出来了。错误代码如下:
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <IPHlpApi.h>
#include <string.h>
#pragma comment(lib,"IPHlpApi.lib")
int main()
{
DWORD dwReturn = 1;
DWORD dwResult = 1;
ULONG ulOutLen = sizeof( IP_ADAPTER_INFO ); //容易忘
IP_ADAPTER_INFO *pIpAdapterInfo = ( IP_ADAPTER_INFO * )malloc( sizeof(IP_ADAPTER_INFO) );
if ( pIpAdapterInfo == NULL )
{
printf("GetMac.cpp main IP_ADAPTER_INFO first malloc failed!");
dwReturn = 1;
goto exit;
}
dwResult = GetAdaptersInfo( pIpAdapterInfo, &ulOutLen );
if ( dwResult == ERROR_BUFFER_OVERFLOW )
{
printf("GetMac.cpp main GetAdaptersInfo first param IP_ADAPTER_INFO is too small,need to add space!");
free(pIpAdapterInfo);
pIpAdapterInfo = ( IP_ADAPTER_INFO * ) malloc( ulOutLen );
if ( pIpAdapterInfo == NULL )
{
printf("GetMac.cpp main IP_ADAPTER_INFO second malloc failed!");
dwReturn = 1;
goto exit;
}
dwResult = GetAdaptersInfo( pIpAdapterInfo, &ulOutLen );
}
if ( dwResult != ERROR_SUCCESS )
{
printf("GetMac.cpp main GetAdaptersInfo failed,Error:%lu", dwResult );
dwReturn = 2;
goto exit;
}
IP_ADAPTER_INFO *pAdapter = pIpAdapterInfo;
char szMac[20];
char szMacTempory[10];
memset( szMac, 0, 20 );
memset( szMacTempory, 0, 10 );
while ( pAdapter )
{
printf("\n\tAdapter desc:%s\t\n",pAdapter->Description);
printf("\n\tAdapter AddressLength:%d\t\n",pAdapter->AddressLength);
for ( UINT dwIndex = 0; dwIndex < pAdapter->AddressLength; dwIndex++ )
{
if ( dwIndex < (pAdapter->AddressLength - 1) )
{
sprintf( szMacTempory, "%02X:", pAdapter->Address[dwIndex] );
strcat( szMac, szMacTempory );
//printf("%02X:", pAdapter->Address[dwIndex]);
}
else if( dwIndex == (pAdapter->AddressLength - 1) )
{
sprintf( szMacTempory, "%02X", pAdapter->Address[dwIndex] );
strcat( szMac, szMacTempory );
// printf("%02X", pAdapter->Address[dwIndex]);
}
printf("%lu ",dwIndex);
}
printf("szMac: %s",szMac);
pAdapter = pAdapter->Next;
}
dwReturn = 0;
goto exit;
exit:
if (pIpAdapterInfo)
{
free(pIpAdapterInfo);
}
return dwReturn;
}
2、程序只能完整地列出一个网卡,当列出第二个网卡的时候,就会出现 ,getmac.exe程序异常停止的情况。可以看出是在列出网卡的mac地址时出问题了。
3、我在for循环中的大部分地方都加了log(for ( UINT dwIndex = 0; dwIndex < pAdapter->AddressLength; dwIndex++ )循环体中),但是都是只执行到第二个网卡的前五位mac地址,执行到第六位mac地址时就会出错,很准时的bug,而且每次都在那个地方出现。于是,为了方便简单地排除故障,我把for中的第一个if中的
sprintf( szMacTempory, "%02X:", pAdapter->Address[dwIndex] );
strcat( szMac, szMacTempory );
这条语句换成了我熟悉的
printf("%02X:", pAdapter->Address[dwIndex]);
把for中的第一个else if中的
sprintf( szMacTempory, "%02X", pAdapter->Address[dwIndex] );
strcat( szMac, szMacTempory );
换成了我熟悉的
printf("%02X", pAdapter->Address[dwIndex]);
结果就不会弹出bug。大致把错误定位在了sprintf和strcat中。
4、sprintf用的是一个临时变量,应该不会产生什么问题。strcat保存的是一个大的变量,的确有可能出问题。后来还真发现,是strcat出问题了。我一直在连接字符串,却没有清空字符串,因此会出错。
5、我的解决方案是:在while中for循环之前使用以下语句,来清空刚刚用strcat连接的上一个网卡的mac地址信息。
memset( szMac, 0, 20 ); //使用strcat最容易忘记 清空数组。
6、可见,在用c/c++对 字符串 进行操作时一定要有足够的 细心,不然很容易出错。