C++ 编程处理字符串经常出错,我自己接管了Windows的那个错误报告
/* ---------------------------------- 字符串处理异常错误响应的实现 使用方法:1、定义InvalidParameterHandle这个错误响应回调函数,如果strcpy这类CRT函数出错,会调用此函数响应错误2、在程序入口点定义_CrtSetReportMode( _CRT_ASSERT, 0 );接管VC的错误处理机制 ---------------------------------- */#include <Windows.h>#include <tchar.h>#include <stdio.h>#include <errno.h>#include <locale.h>#include <string.h>#include <crtdbg.h>#include <strsafe.h>// CRT 标准运行库中的字符串处理函数异常错误响应回调函数void InvalidParameterHandle( LPCTSTR lpExpression, LPCTSTR lpFunction, LPCTSTR lpFile, UINT line, uintptr_t uip = NULL );int _tmain(){_CrtSetReportMode( _CRT_ASSERT, 0 );// 所有线程都使用同样的区域配置_configthreadlocale( _DISABLE_PER_THREAD_LOCALE );// 设置当前进程的区域配置为中文中国_tsetlocale( LC_ALL, /*_T("chinese_china")*/_T("Chinese_People's Republic of China") );_tprintf_s( L"字符串处理示例程序:\n" );// 传统字符串处理函数// 注册用户定义的异常处理函数_set_invalid_parameter_handler( InvalidParameterHandle );TCHAR szSourceStr[20] = _T("Hello World!\n");TCHAR szDestination[10] = _T("---");errno_t result = _tcscpy_s( szDestination, _countof(szDestination), szSourceStr );return 0;}// CRT 标准运行库中的字符串处理函数异常错误响应回调函数void InvalidParameterHandle( LPCTSTR lpExpression, LPCTSTR lpFunction, LPCTSTR lpFile, UINT line, uintptr_t uip ){TCHAR szErrorReason[BUFSIZ] = {0};switch( errno ){case E2BIG:_tcscpy_s( szErrorReason, BUFSIZ, _T("argument list too long") ); break;case EACCES: _tcscpy_s( szErrorReason, BUFSIZ, _T("permission denied") ); break;case EADDRINUSE: _tcscpy_s( szErrorReason, BUFSIZ, _T("address in use") ); break;case EADDRNOTAVAIL: _tcscpy_s( szErrorReason, BUFSIZ, _T("address not available") ); break;case EAFNOSUPPORT: _tcscpy_s( szErrorReason, BUFSIZ, _T("address family not supported") ); break;case EAGAIN: _tcscpy_s( szErrorReason, BUFSIZ, _T("resource unavailable try again") ); break;case EALREADY: _tcscpy_s( szErrorReason, BUFSIZ, _T("connection already in progress") ); break;case EBADF: _tcscpy_s( szErrorReason, BUFSIZ, _T("bad file descriptor") ); break;case EBADMSG: _tcscpy_s( szErrorReason, BUFSIZ, _T("bad message") ); break;case EBUSY: _tcscpy_s( szErrorReason, BUFSIZ, _T("device or resource busy") ); break;case ECANCELED: _tcscpy_s( szErrorReason, BUFSIZ, _T("operation canceled") ); break;case ECHILD: _tcscpy_s( szErrorReason, BUFSIZ, _T("no child process") ); break;case ECONNABORTED: _tcscpy_s( szErrorReason, BUFSIZ, _T("connection aborted") ); break;case ECONNREFUSED: _tcscpy_s( szErrorReason, BUFSIZ, _T("connection refused") ); break;case ECONNRESET: _tcscpy_s( szErrorReason, BUFSIZ, _T("connection reset") ); break;case EDEADLK: _tcscpy_s( szErrorReason, BUFSIZ, _T("resource deadlock would occur") ); break;case EDESTADDRREQ: _tcscpy_s( szErrorReason, BUFSIZ, _T("destination address required") ); break;case EDOM: _tcscpy_s( szErrorReason, BUFSIZ, _T("argument out of domain") ); break;case EEXIST: _tcscpy_s( szErrorReason, BUFSIZ, _T("file exists") ); break;case EFAULT: _tcscpy_s( szErrorReason, BUFSIZ, _T("bad address") ); break;case EFBIG: _tcscpy_s( szErrorReason, BUFSIZ, _T("file too large") ); break;case EHOSTUNREACH: _tcscpy_s( szErrorReason, BUFSIZ, _T("host unreachable") ); break;case EIDRM: _tcscpy_s( szErrorReason, BUFSIZ, _T("identifier removed") ); break;case EILSEQ: _tcscpy_s( szErrorReason, BUFSIZ, _T("illegal byte sequence") ); break;case EINPROGRESS: _tcscpy_s( szErrorReason, BUFSIZ, _T("operation in progress") ); break;case EINTR: _tcscpy_s( szErrorReason, BUFSIZ, _T("interrupted") ); break;case EINVAL: _tcscpy_s( szErrorReason, BUFSIZ, _T("invalid argument") ); break;case EIO: _tcscpy_s( szErrorReason, BUFSIZ, _T("io error") ); break;case EISCONN: _tcscpy_s( szErrorReason, BUFSIZ, _T("already connected") ); break;case EISDIR: _tcscpy_s( szErrorReason, BUFSIZ, _T("is a directory") ); break;case ELOOP: _tcscpy_s( szErrorReason, BUFSIZ, _T("too many synbolic link levels") ); break;case EMFILE: _tcscpy_s( szErrorReason, BUFSIZ, _T("too many files open") ); break;case EMLINK: _tcscpy_s( szErrorReason, BUFSIZ, _T("too many links") ); break;case EMSGSIZE: _tcscpy_s( szErrorReason, BUFSIZ, _T("message size") ); break;case ENAMETOOLONG: _tcscpy_s( szErrorReason, BUFSIZ, _T("filename too long") ); break;case ENETDOWN: _tcscpy_s( szErrorReason, BUFSIZ, _T("network down") ); break;case ENETRESET: _tcscpy_s( szErrorReason, BUFSIZ, _T("network reset") ); break;case ENETUNREACH: _tcscpy_s( szErrorReason, BUFSIZ, _T("network unreachable") ); break;case ENFILE: _tcscpy_s( szErrorReason, BUFSIZ, _T("too many files open in system") ); break;case ENOBUFS: _tcscpy_s( szErrorReason, BUFSIZ, _T("no buffer space") ); break;case ENODATA: _tcscpy_s( szErrorReason, BUFSIZ, _T("no message available") ); break;case ENODEV: _tcscpy_s( szErrorReason, BUFSIZ, _T("no such device") ); break;case ENOENT: _tcscpy_s( szErrorReason, BUFSIZ, _T("no such file or directory") ); break;case ENOEXEC: _tcscpy_s( szErrorReason, BUFSIZ, _T("executable format error") ); break;case ENOLCK: _tcscpy_s( szErrorReason, BUFSIZ, _T("no lock available") ); break;case ENOLINK: _tcscpy_s( szErrorReason, BUFSIZ, _T("no link") ); break;case ENOMEM: _tcscpy_s( szErrorReason, BUFSIZ, _T("not enough memory") ); break;case ENOMSG: _tcscpy_s( szErrorReason, BUFSIZ, _T("no message") ); break;case ENOPROTOOPT: _tcscpy_s( szErrorReason, BUFSIZ, _T("no protocol option") ); break;case ENOSPC: _tcscpy_s( szErrorReason, BUFSIZ, _T("no space on device") ); break;case ENOSR: _tcscpy_s( szErrorReason, BUFSIZ, _T("no stream resources") ); break;case ENOSTR: _tcscpy_s( szErrorReason, BUFSIZ, _T("not a stream") ); break;case ENOSYS: _tcscpy_s( szErrorReason, BUFSIZ, _T("function not supported") ); break;case ENOTCONN: _tcscpy_s( szErrorReason, BUFSIZ, _T("not connected") ); break;case ENOTDIR: _tcscpy_s( szErrorReason, BUFSIZ, _T("not a directory") ); break;case ENOTEMPTY: _tcscpy_s( szErrorReason, BUFSIZ, _T("directory not empty") ); break;case ENOTRECOVERABLE: _tcscpy_s( szErrorReason, BUFSIZ, _T("state not recoverable") ); break;case ENOTSOCK: _tcscpy_s( szErrorReason, BUFSIZ, _T("not a socket") ); break;case ENOTSUP: _tcscpy_s( szErrorReason, BUFSIZ, _T("not supported") ); break;case ENOTTY: _tcscpy_s( szErrorReason, BUFSIZ, _T("inappropriate io control operation") ); break;case ENXIO: _tcscpy_s( szErrorReason, BUFSIZ, _T("no such device or address") ); break;case EOPNOTSUPP: _tcscpy_s( szErrorReason, BUFSIZ, _T("operation not supported") ); break;case EOTHER: _tcscpy_s( szErrorReason, BUFSIZ, _T("other") ); break;case EOVERFLOW: _tcscpy_s( szErrorReason, BUFSIZ, _T("value too large") ); break;case EOWNERDEAD: _tcscpy_s( szErrorReason, BUFSIZ, _T("owner dead") ); break;case EPERM: _tcscpy_s( szErrorReason, BUFSIZ, _T("operation not permitted") ); break;case EPIPE: _tcscpy_s( szErrorReason, BUFSIZ, _T("broken pipe") ); break;case EPROTO: _tcscpy_s( szErrorReason, BUFSIZ, _T("protocol error") ); break;case EPROTONOSUPPORT: _tcscpy_s( szErrorReason, BUFSIZ, _T("protocol not supported") ); break;case EPROTOTYPE: _tcscpy_s( szErrorReason, BUFSIZ, _T("wrong protocol type") ); break;case ERANGE: _tcscpy_s( szErrorReason, BUFSIZ, _T("result out of range") ); break;case EROFS: _tcscpy_s( szErrorReason, BUFSIZ, _T("read only file system") ); break;case ESPIPE: _tcscpy_s( szErrorReason, BUFSIZ, _T("invalid seek") ); break;case ESRCH: _tcscpy_s( szErrorReason, BUFSIZ, _T("no such process") ); break;case ETIME: _tcscpy_s( szErrorReason, BUFSIZ, _T("stream timeout") ); break;case ETIMEDOUT: _tcscpy_s( szErrorReason, BUFSIZ, _T("timed out") ); break;case ETXTBSY: _tcscpy_s( szErrorReason, BUFSIZ, _T("text file busy") ); break;case EWOULDBLOCK: _tcscpy_s( szErrorReason, BUFSIZ, _T("operation would block") ); break;case EXDEV: _tcscpy_s( szErrorReason, BUFSIZ, _T("cross device link") ); break;}TCHAR szPromptErrorMsg[BUFSIZ] = {0};_stprintf_s( szPromptErrorMsg, _T("程序处理字符串出现异常,中止运行。\n>错误原因:%s。\n"), szErrorReason );#ifdef _DEBUGTCHAR szErrorStr[BUFSIZ] = {0};_stprintf_s( szErrorStr, _T(">错误文件:%s。\n>错误函数:%s。\n>错误位置:%d。\n"), lpFile, lpFunction, line );_tcscat_s( szPromptErrorMsg, BUFSIZ, szErrorStr );#endifMessageBox( NULL, szPromptErrorMsg, _T("Fatal Error"), MB_OK | MB_ICONEXCLAMATION );exit(-255);}