【问题标题】:How do i modify this LPSTR?如何修改此 LPSTR?
【发布时间】:2011-12-29 02:39:17
【问题描述】:

假设我有这个变量

LPTSTR cmdArgs = "D:\\path\my.exe -user blah PLATFORM=0 DEVICE=0 -k poclbm VECTORS BFI_INT WORKSIZE=128 AGGRESSION=7";

注意它在哪里说 DEVICE=0,在我的情况下它可能是 DEVICE=1 或 DEVICE=2 等。

这意味着该字符串必须是动态的。我将把应该在 DEVICE= 之后的数字传递给一个函数,但是我不知道如何将它添加到 cmdArgs 变量中。

我正在考虑使用 sprintf 并执行 DEVICE=%d,但我不知道是否可以将 char 变量(将包含格式化字符串)转换为 LPSTR

【问题讨论】:

  • 是您的代码行中的 LPTSTR 还是您的问题中的 LPSTR?
  • 如果你想继续使用上个世纪的这个特性,那就保持一致。使用 LPTSTR、TCHAR 缓冲区[]、_T("literal") 和 _stprintf()。所剩无几,上周最后运行的非 Unicode 版本的 Windows 上的软盘驱动器死了。

标签: c winapi api


【解决方案1】:

LPSTRchar * 的类型定义。您可以使用sprintf 将设备号插入到字符串中。

char cmdArgs[1000];
int deviceNum = 1;
sprintf( cmdArgs, "D:\\path\\my.exe -user blah PLATFORM=0 DEVICE=%d -k poclbm VECTORS BFI_INT WORKSIZE=128 AGGRESSION=7", deviceNum );

编辑:
由于代码 sn-p 显示 LPTSTR,您可能希望使用 TCHAR 例程而不是 sprintf。当 _UNICODE 预处理器符号被定义时,LPTSTR 的类型定义为 whcar_t *,如果该符号未定义或 _MBCS 已定义,则 char *

TCHAR cmdArgs[1000];
int deviceNum = 1;
_stprintf( cmdArgs, _T(""D:\\path\\my.exe -user blah PLATFORM=0 DEVICE=%d -k poclbm VECTORS BFI_INT WORKSIZE=128 AGGRESSION=7"), deviceNum );

【讨论】:

  • 他说LPTSTR,所以你要_tsprintf
  • @BenVoigt 谢谢,你是对的。问题的标题是 LPSTR,但代码 sn-p 本身却是 LPTSTR
【解决方案2】:

您的摘要显示为 LPSTR,但您的代码块显示为 LPTSTR。这些(可能)是不同的东西,这取决于您是否正在为 Unicode 构建。

在 unicode 构建中,LPTSTR 是 wchar_t*。在非 unicode 中,LPTSTR 是 char*。 LPSTR 在这两种情况下都是 char*。

winnt.h 有这些 typedef(这些不是字面的 typedef,我在这里做了一些解释):

typedef char CHAR;
typedef CHAR *LPSTR;

typedef wchar_t WCHAR;
typedef WCHAR *LPWSTR;

#ifdef UNICODE
typedef LPWSTR LPTSTR;
#else
typedef LPSTR LPTSTR;
#endif

如果您正在构建非 Unicode,使用 %d 的 sprintf 将按照其他人在此处指定的方式执行您想要的操作。

【讨论】:

    【解决方案3】:

    为什么不使用 %s,因为你有一个 char *

    【讨论】:

    • 对,我猜我脑子里放了个屁 :)。任何人,我仍然不知道是否可以将 char* 转换为 LPSTR。
    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 2021-12-05
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多