2014-02-14 15 views
0

我必须解析命令行参数并将某些字符转换为整数。在Win32 API中从命令行解析的字符未处理异常

我有以下代码:

TCHAR *token1; 
token1 = strchr(cmd_line, L'+'); 
MessageBox(NULL, token1, _T("test"), NULL); 

//char *str = "+10 frogs"; 
TCHAR *endptr =" "; 

long n = strtol(token1 + 1, &endptr, 0); 

if (!*endptr) 
    MessageBox(NULL, "No error", _T("test"), NULL); 
else 
    MessageBox(NULL, "error", _T("test"), NULL); 

当命令提示被发送的命令“WesOPC.exe 10 -regserver”,则消息框显示“10 -regserver”。

我需要将10存储为整数。因此,我使用了strtol,但显示了带有错误的消息框。

,当我试图调试它,在线看到的错误

long n = strtol(token1 + 1, &endptr, 0); 

Unhandled exception at 0x0042d368 in WesOPC.exe: 0xC0000005: Access violation reading location 0x00000001. 

'N' 应该是10

回答

3

你得到在内存中的AV地址0x00000001。您正在将012添加到token1。这意味着token1为NULL,但您的代码没有检查该情况。事实上,在这种情况下,您对MessageBox()的呼叫应显示空白字符串。

另一个问题是,您在同一代码中混合了char*,wchar_t*TCHAR*token1使用TCHAR*,L'+'使用wchar_t,strchr()预计char*char。你的代码甚至不应该按原样编译。停止混合数据类型并选择一种类型来处理所有事情。

试试这个:

// where cmd_line is TCHAR*... 
TCHAR *token1 = _tcschr(cmd_line, _T('+')); 
if (token1) 
{ 
    MessageBox(NULL, token1, TEXT("test"), NULL); 

    //char *str = "+10 frogs"; 
    TCHAR *endptr = " "; 

    ++token1; 
    long n = _tcstol(token1, &endptr, 0); 

    if ((n == 0) && (endptr == token1)) 
     MessageBox(NULL, TEXT("error"), TEXT("test"), NULL); 
    else 
     MessageBox(NULL, TEXT("No error"), TEXT("test"), NULL); 
} 
else 
    MessageBox(NULL, TEXT("param not found"), TEXT("test"), NULL); 

或者停止支持ANSI和刚进去的一切完整的Unicode:

// where cmd_line is LPWSTR... 
LPWSTR token1 = wcschr(cmd_line, L'+'); 
if (token1) 
{ 
    MessageBoxW(NULL, token1, L"test", NULL); 

    //char *str = "+10 frogs"; 
    LPWSTR *endptr = L" "; 

    ++token1; 
    long n = wcstol(token1, &endptr, 0); 

    if ((n == 0) && (endptr == token1)) 
     MessageBoxW(NULL, L"error", L"test", NULL); 
    else 
     MessageBoxW(NULL, L"No error", L"test", NULL); 
} 
else 
    MessageBoxW(NULL, L"param not found", L"test", NULL);