求助,很奇葩的问题

hjl0508 2014-07-30 10:14:10
同样一个函数在其他的项目里正常,在某个项目里就是不正常,看下边的图
这是正常的

这个不知道为什么会出现下边一堆乱码,传入的字符串在下边显示的也是正常的,本来开始还是正常的,不知道怎么搞的突然就成这样了。。。很无语,求解答
...全文
559 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-08-01
  • 打赏
  • 举报
回复
_splitpath, _wsplitpath Break a path name into components. void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext ); void _wsplitpath( const wchar_t *path, wchar_t *drive, wchar_t *dir, wchar_t *fname, wchar_t *ext ); Routine Required Header Compatibility _splitpath <stdlib.h> Win 95, Win NT _wsplitpath <stdlib.h> or <wchar.h> Win 95, Win NT For additional compatibility information, see Compatibility in the Introduction. Libraries LIBC.LIB Single thread static library, retail version LIBCMT.LIB Multithread static library, retail version MSVCRT.LIB Import library for MSVCRT.DLL, retail version Return Value None Parameters path Full path drive Optional drive letter, followed by a colon (:) dir Optional directory path, including trailing slash. Forward slashes ( / ), backslashes ( \ ), or both may be used. fname Base filename (no extension) ext Optional filename extension, including leading period (.) Remarks The _splitpath function breaks a path into its four components. _splitpath automatically handles multibyte-character string arguments as appropriate, recognizing multibyte-character sequences according to the multibyte code page currently in use. _wsplitpath is a wide-character version of _splitpath; the arguments to _wsplitpath are wide-character strings. These functions behave identically otherwise. Generic-Text Routine Mappings TCHAR.H Routine _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined _tsplitpath _splitpath _splitpath _wsplitpath Each argument is stored in a buffer; the manifest constants _MAX_DRIVE, _MAX_DIR, _MAX_FNAME, and _MAX_EXT (defined in STDLIB.H) specify the maximum size necessary for each buffer. The other arguments point to buffers used to store the path elements. After a call to _splitpath is executed, these arguments contain empty strings for components not found in path. You can pass a NULL pointer to _splitpath for any component you don’t need. Example /* MAKEPATH.C */ #include <stdlib.h> #include <stdio.h> void main( void ) { char path_buffer[_MAX_PATH]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; _makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" ); printf( "Path created with _makepath: %s\n\n", path_buffer ); _splitpath( path_buffer, drive, dir, fname, ext ); printf( "Path extracted with _splitpath:\n" ); printf( " Drive: %s\n", drive ); printf( " Dir: %s\n", dir ); printf( " Filename: %s\n", fname ); printf( " Ext: %s\n", ext ); } Output Path created with _makepath: c:\sample\crt\makepath.c Path extracted with _splitpath: Drive: c: Dir: \sample\crt\ Filename: makepath Ext: .c File Handling Routines See Also _fullpath, _getmbcp, _makepath, _setmbcp
赵4老师 2014-08-01
  • 打赏
  • 举报
回复
使用TCHAR和_tsplitpath
赵4老师 2014-08-01
  • 打赏
  • 举报
回复
_tsplitpath
Sidyhe 2014-07-31
  • 打赏
  • 举报
回复
lin5161678 2014-07-30
  • 打赏
  • 举报
回复
引用 6 楼 zhousitiaoda 的回复:
很有可能是哪个地方数组越界导致栈破坏了。 另外定义了这么多数组却都不初始化,不知道是怎么想的。
初始化在这里没什么意义 定义了数组就得初始化 不知道是怎么想的
勤奋的小游侠 2014-07-30
  • 打赏
  • 举报
回复
可能是中文路径的原因。 不过话说回来,你返回的name是一个临时变量数组指针,这样可以么?
zhousitiaoda 2014-07-30
  • 打赏
  • 举报
回复
很有可能是哪个地方数组越界导致栈破坏了。 另外定义了这么多数组却都不初始化,不知道是怎么想的。
caozl 2014-07-30
  • 打赏
  • 举报
回复
1. 检查一下是不是因为中文路径的原因 2. 检查一下这两个项目导入了哪些不同的库 可能这个函数使用的库找到了不同的版本
灌水号 2014-07-30
  • 打赏
  • 举报
回复
试试_wsplitpath
边走边瞧 2014-07-30
  • 打赏
  • 举报
回复
_splitpath代码没有,无法判断原因。
hjl0508 2014-07-30
  • 打赏
  • 举报
回复
引用 1 楼 u014444402 的回复:
name 没有初始化为0,而且188行你又没有执行,数据没有拷贝到name里面,乱码是正常的。
我说的是下边调试框里的哪些dir,drive。。。什么的里面的东西就不对,复制过去肯定也不对
灌水号 2014-07-30
  • 打赏
  • 举报
回复
name 没有初始化为0,而且188行你又没有执行,数据没有拷贝到name里面,乱码是正常的。
bdyrom 2014-07-30
  • 打赏
  • 举报
回复
注意出问题的那个项目中的两个方面即可 第一、宏定义 第二、全局变量 要是那个项目是个大项目 够你搞一两天了
罗博士 2014-07-30
  • 打赏
  • 举报
回复
20楼有道理,看看这个问题是怎么产生的?
North_Shore 2014-07-30
  • 打赏
  • 举报
回复
我读文件的时候遇到过,是由于一个数组溢出,覆盖了其后区域,导致堆栈被破坏;其后对堆栈内数据的操作会导致中断
water-moon 2014-07-30
  • 打赏
  • 举报
回复
还有你看一下name和dir这里是不是比其他数组长一些
water-moon 2014-07-30
  • 打赏
  • 举报
回复
你注意看一下dir和name的地址一样的呢,感觉是栈分配出的问题,你把数组放到全局试一下。这样做仅供测试用哈
zhousitiaoda 2014-07-30
  • 打赏
  • 举报
回复
引用 17 楼 lin5161678 的回复:
[quote=引用 16 楼 zhousitiaoda 的回复:] 你不初始化就默认_splitepath这种(无论是API还是组里其他人写的函数)对fname的操作必须要有有结束符,如果你说是,并且没有结束符就是错误的,那我没话说,这个话题就此结束。
不管是api还是其他人写的函数 如果他告诉我 fname是字符串 而结果没有结束符 那么 这理所当然必须是一个错误 如果他告诉我 fname不是字符串 那么我绝对不会用操作字符串的函数操作他 而且 既然fname不是字符串 你以为你初始化就对了 你以为你初始化然后就能用strcpy 操作了? 对于不是字符串fname '\0' 完全可能是一个有效果字符 而不能作为结束符 可能 人家的数据整体就是 \x11\x14\x00\xee\xaf\xcc 中间有一个\x00 而全部数据包括后面的\xee.. 如果你这里初始化了 然后按照strcpy 处理 不会报错 不会在这里运行崩溃 但是 有效数据\xee... 被你弄丢了 是怎么回事?[/quote] 你说的有道理,我收回在6L说的,不过我仍坚持定义的同时去初始化。
zhousitiaoda 2014-07-30
  • 打赏
  • 举报
回复
引用 15 楼 lin5161678 的回复:
[quote=引用 13 楼 zhousitiaoda 的回复:] 2:同一段代码在不同的环境下有可能表现不同。就你的例子而言,如果形参过长,长到分离出的几个字符串都超过你定义的长度,越界不可避免。运行的环境不同需要考虑的就更多,msdn上的只是作为demo演示怎么使用。
你有没有看懂 数组定义的长度的那个宏是干嘛用的? 而且 你所说的数组越界的问题 难道初始化数组就有用了? 照你说的 形参过长 这里 该越界还是越界 数组有没有初始化 没一分钱关系 也没一分钱影响 [/quote] 形参过长初始化数组确实没什么影响,我在13L说的只有1个意思:不要盲目msdn提供的代码。
lin5161678 2014-07-30
  • 打赏
  • 举报
回复
引用 16 楼 zhousitiaoda 的回复:
你不初始化就默认_splitepath这种(无论是API还是组里其他人写的函数)对fname的操作必须要有有结束符,如果你说是,并且没有结束符就是错误的,那我没话说,这个话题就此结束。
不管是api还是其他人写的函数 如果他告诉我 fname是字符串 而结果没有结束符 那么 这理所当然必须是一个错误 如果他告诉我 fname不是字符串 那么我绝对不会用操作字符串的函数操作他 而且 既然fname不是字符串 你以为你初始化就对了 你以为你初始化然后就能用strcpy 操作了? 对于不是字符串fname '\0' 完全可能是一个有效果字符 而不能作为结束符 可能 人家的数据整体就是 \x11\x14\x00\xee\xaf\xcc 中间有一个\x00 而全部数据包括后面的\xee.. 如果你这里初始化了 然后按照strcpy 处理 不会报错 不会在这里运行崩溃 但是 有效数据\xee... 被你弄丢了 是怎么回事?
加载更多回复(8)

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧