【发布时间】:2019-11-27 18:39:01
【问题描述】:
我看到了我不久前做过的一个古老的简单算法。我使用 dev-c ++ 完成了它,但现在我在 Visual Studio 中编译它并不起作用。 Visual Studio 编译器说:'strcpy':这个函数或变量可能不安全。考虑改用 strcpy_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS。 (第 17 行)
在这个简单的项目中,您将键入一个短语,然后将短语翻译成十六进制(每个字符)。
那么为什么 dev-c++ 不告诉我呢?我犯了什么错误吗?或者不是......代码还可以吗?我想了解这一点,因为这不是我第一次收到该错误。
代码执行示例:
请插入一个短语:你好世界! 字符串 -hello world!- 以十六进制转换为 68 65 6c 6c 6f 20 77 6f 72 6c 64 21
#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
using namespace std;
int main()
{
string phrase;
char* chArray;
cout << "Pls insert a phrase:\t";
getline(cin, phrase);
chArray = new char[phrase.size() + 1];
strcpy(chArray, phrase.c_str()); //THE ERROR IS HERE!
cout << "The string -" << phrase << "- converted in hex is\n";
for (int i = 1; i < static_cast<int>(phrase.size() + 1); i++)
{
int ch = (int)chArray[i-1];
cout << setbase(16) << ch << " ";
if (i % 5 == 0)
cout << "\n";
}
return 0;
}
【问题讨论】:
-
您为什么使用
std::string和c 字符串?不需要chArray,使用phrase即可。 -
使用
_CRT_SECURE_NO_WARNINGS禁用警告。之所以存在警告,是因为 Microsoft 的一个团队确定了他们认为存在潜在安全风险的标准 C 函数。 -
顺便说一句,避免这种情况:
static_cast<int>(phrase.size() + 1)只需使用size_t而不是int -
好的,希望您的问题得到解答,但究竟为什么
chArray存在呢?你为什么不直接写int ch = (int)phrase[i-1];?您可以在std::string上使用[]。 -
基于范围的 for 循环也可以稍微简化这一点。
for (char ch:phrase) { cout << setbase(16) << (int)ch << " "; ... }