我正在将Decoder用于Microsoft脚本编码器。当我在Codeblocks中运行它时,它工作得很好。但是当我在Visual Studio中运行它时,它显示了以下错误
代码段1:
char decodeMnemonic(unsigned char *mnemonic)
{
int i = 0;
while (entities[i].entity != NULL)
{
**if (strcmp(entities[i].entity, mnemonic) == 0)**
**//Error 1: cannot convert argument 2 from 'unsigned char *'
// to 'const char *'**
return entities[i].mappedchar;
i++;
}
printf("Warning: did not recognize HTML entity '%s'\n", mnemonic);
return '?';
}
我必须将Decoder集成到程序中,所以我没有在命令行中传递文件名作为命令行参数,而是在代码中给了它们自己的文件路径。
代码段2:
int main()
{
unsigned char *inname = "C:\\Users\\Karthi\\Desktop\\Project Winter 2018-19\\poweliks_sample\\poweliks_encoded_js.bin";
unsigned char *outname = "C:\\Users\\Karthi\\Desktop\\Project Winter 2018-19\\poweliks_sample\\decoded1.txt";
unsigned int cp = 0;
//**Error 2: 'initializing': cannot convert from 'const char [87]' to 'unsigned char *'**
答案 0 :(得分:0)
您可以使用reinterpret_cast
(对于unsigned char*
至const char*
)。但是,如果您从const unsigned char*
变为非const
类型,则必须首先使用const_cast
,因为reinterpret_cast
无法丢弃const
。
下面的段落简要概述了为什么您的代码不起作用。
根据C99 Standard(类似于其他C标准),字符串文字具有静态存储持续时间,其类型为char[]
,该标准表示:
如果程序尝试修改此类数组,则行为未定义。
使用argv
时程序运行的原因是,argv
不被视为字符串文字数组。这意味着您可以对其进行修改。
答案 1 :(得分:0)
以下是您解决问题的方法:
代码段1: strcmp是比较两个C字符串的一种方法。它需要const char *类型。
int strcmp(const char * str1,const char * str2); 您有两种选择来解决它:
像这样声明您的方法
char decodeMnemonic(const char *mnemonic)
使用C ++ Strings并像这样声明您的方法
char decodeMnemonic(std::string mnemonic)
如果使用第二种解决方案,则必须调用c_str()-Method才能在strcmp中使用它
if (strcmp(entities[i].entity, mnemonic.c_str()) == 0)
或者您仅使用C ++-String:请在此处阅读如何使用它:http://www.cplusplus.com/reference/string/string/compare/
代码段2:您不能像这样使用它,因为您有字符串常量,它们是数组常量字符。 请使用C ++字符串。您使用C ++,因此请使用他的功能(https://www.geeksforgeeks.org/stdstring-class-in-c/)
无论如何,如果您想像C一样使用它:https://www.programiz.com/c-programming/c-strings
char c[] = "abcd";
char c[50] = "abcd";
或使用const(C ++)
char *str1 = "string Literal";
const char *str2 = "string Literal";