#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){ WIN32_FIND_DATA fd;
HANDLE hFile=FindFirstFile(argv[0],&fd);
char str[50];
sprintf_s(str,"%d",fd.cFileName);
cout<<str<<endl; system("pause");
return 0;
}
上述代码:str为"n"  为什么不是"new.exe"??????????

解决方案 »

  1.   

    sprintf_s(str,"%d",fd.cFileName);
    ==>
    应该是%s
      

  2.   

    噢,我写错了,在编译的时候,是%s,就是%s的时候,str的值为n,而不是new.exe
      

  3.   

    你的代码是不是用UNICODE编译的?那么其实程序名就是new.exe。如果用的是VC6,可以在选项中打开显示UNICODE字符串的选项,在调试器中查看内存中是不是new.exe,UNICODE是占2字节的,而西文字符只需要一个字节就可以显示,第二个字节是NULL,而UNICODE字符是需要2个NULL字符做结束的。
      

  4.   

    编码问题吧?你什么环境?Unicode还是多字节编码??
      

  5.   

    楼上,你是对的,我刚刚用多字节重新编译了下,发现结果输出正确了,请问如果我想用unicode编译要怎么改写代码?
      

  6.   

    sprintf_s(str,"%s",fd.cFileName);
      

  7.   

    你的工程是unicode的,fd.cFileName中存的是unicode字符串改法1:工程改为非unicode的。
    对于vs2005,项目 | 属性 | 配置属性 | c/c++ | 预处理器 | 预处理器定义 | ...按钮 | “从父级或项目默认设置继承”复选框UnCheck | 确定改法2:输出unicode串
    char str[50];
    sprintf_s(str,"%d",fd.cFileName);
    改为
    TCHAR str[50];
    _stprintf(str, _T("%d"), fd.cFileName);
    可能需要tchar.h头文件。还有一种方法, fd.cFileName转化为ansi再输出。
    有兴趣的话看一下api WideCharToMultiByte
      

  8.   

    8楼,我按照你的第二种方法改写代码,输出的是str的地址,而不是值。我添加中断,发现str储存的是test1.exe,为什么用cout输出出错?