【问题标题】:'strcpy' error and warning“strcpy”错误和警告
【发布时间】:2010-04-22 17:20:05
【问题描述】:

我收到以下行的“strcpy”错误和警告:

_tcscpy(strCommandLine,_T("MyProgram.exe /param1"));

_tcscpy(strApplicationName,_T("MyProgram.exe"));

由于我没有使用“strcpy”,所以不确定为什么会收到“strcpy”错误或警告。与此相关的唯一行是:

LPCTSTR strApplicationName;
LPTSTR strCommandLine;
_tcscpy(strCommandLine,_T("MyProgram.exe /param1"));   //warning is on this line     
_tcscpy(strApplicationName,_T("MyProgram.exe"));       //error is on this line

输出是:

1>c:\documents and settings\X.X\my documents\sandbox\sample.cpp(52) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

1>        c:\program files\microsoft visual studio 8\vc\include\string.h(74) : see declaration of 'strcpy'

1>c:\documents and settings\X.X\my documents\sandbox\sample.cpp(53) : error C2664: 'strcpy' : cannot convert parameter 1 from 'LPCTSTR' to 'char *'

1>        Conversion loses qualifiers

对这意味着什么有什么想法吗?

这些是我的标题:

iostream
windows.h
stdio.h
tchar.h
winnt.h

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

    LPCTSTR 表示const TCHAR 指针。 _tcscpy 的第一个参数需要一个非常量 TCHAR 指针,即LPTSTR

    试试这样的:

    TCHAR strApplicationName[2000];
    TCHAR strCommandLine[2000[;
    _tcscpy(strCommandLine,_T("MyProgram.exe /param1"));   //warning is on this line     
    _tcscpy(strApplicationName,_T("MyProgram.exe")); 
    

    PS:即使这很可能是不正确的。给我们更多上下文(更多周边代码),我们将能够更好地帮助您。

    【讨论】:

    • +1 不用于随机指针。其次,要求提供更多信息 - 也许std::string 会起作用。
    【解决方案2】:

    LPCTSTR 是指向 constant 字符串的指针的 typedef 名称。您不能将任何内容复制到常量字符串。

    至于警告,这是微软编译器自行提出的。如果您想使用strcpy,请禁用警告。消息本身会告诉您如何操作。

    【讨论】:

      【解决方案3】:

      strcpy 复制字符直到遇到\0 空终止符。这可能会导致缓冲区溢出和其他问题。 strcpy_s 仅复制指定数量的字符,因此您可以告诉它在超出缓冲区之前停止复制。详情请见http://msdn.microsoft.com/en-us/library/td1esda9(VS.80).aspx

      【讨论】:

      • strcpy 隐藏在宏下面;正如 OP 所提到的,他们收到了不是 strcpy 的警告。
      • 而且我认为使用 strncpy 会更好,因为那是标准 C++,而不是 strcpy_s 似乎是 MS 的东西。
      【解决方案4】:

      警告告诉您strcpy 已被弃用(显然_tcscpy 调用strcpy)。

      _tcscpy的第一个参数是目标字符串,所以不能是常量。 LPCTSTR 中的“C”表示const

      【讨论】:

      • 我不这么认为。警告消息说:错误 C2664: 'strcpy' : cannot convert parameter 1 from 'LPCTSTR' to 'char *' Conversion lost qualifiers"
      猜你喜欢
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2021-03-09
      相关资源
      最近更新 更多