Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Visual Studio中初始化C中的字符串_C_Compiler Errors_Visual Studio 2017 - Fatal编程技术网

在Visual Studio中初始化C中的字符串

在Visual Studio中初始化C中的字符串,c,compiler-errors,visual-studio-2017,C,Compiler Errors,Visual Studio 2017,我尝试使用C学习XOR算法。我在以下方面找到了一个很好的示例: #包括 #包括 无效加密解密(字符*输入,字符*输出){ char key[]={'K','C','Q'};//可以是任何字符和任何大小的数组 int i; 对于(i=0;i容器。< / P> < P>微软编译器不支持C99 VLAS(见注释)。数组大小必须是常量表达式。代码也会被破坏,因为它无法容纳并在输出中放置nul终止符 在这种情况下,解密的和加密的可以这样声明: char encrypted[sizeof(baseStr)]

我尝试使用C学习XOR算法。我在以下方面找到了一个很好的示例:

#包括
#包括
无效加密解密(字符*输入,字符*输出){
char key[]={'K','C','Q'};//可以是任何字符和任何大小的数组
int i;
对于(i=0;i
上述方法在Linux和gcc下运行良好。 但是,它不会在Windows下的Visual Studio中编译

我正在使用Visual Studio 2017中包含的构建工具


我做错了什么?

Microsoft的编译器不支持C99 VLA(请参阅注释)。数组大小必须是常量表达式。代码也会被破坏,因为它无法容纳并在输出中放置nul终止符

在这种情况下,
解密的
加密的
可以这样声明:

char encrypted[sizeof(baseStr)] ;
...
char decrypted[sizeof(baseStr)] ;
encryptDecrypt()
修改如下:

void encryptDecrypt(char *input, char *output) {

...

    output[i] = 0 ;
}
最后,可以通过将
i
声明为type
size\u t
来清除已签名的不匹配警告


当然,在Windows上,如果您想要更现代的C支持,您可以始终使用MinGW/GCC。或者,如果你想坚持使用微软编译器,你可以使用C++和<代码> STD::String 或 STD::vector < /COD>容器。< / P> < P>微软编译器不支持C99 VLAS(见注释)。数组大小必须是常量表达式。代码也会被破坏,因为它无法容纳并在输出中放置nul终止符

在这种情况下,
解密的
加密的
可以这样声明:

char encrypted[sizeof(baseStr)] ;
...
char decrypted[sizeof(baseStr)] ;
encryptDecrypt()
修改如下:

void encryptDecrypt(char *input, char *output) {

...

    output[i] = 0 ;
}
最后,可以通过将
i
声明为type
size\u t
来清除已签名的不匹配警告


当然,在Windows上,如果您想要更现代的C支持,您可以始终使用MinGW/GCC。也可以使用C++和<代码> STD::String 或 STD::Vector < /Case>容器,如果你想坚持使用微软编译器。

< P>使用<代码> MalOC/<代码>进行动态内存分配。需要
#包括

如前所述,必须为结尾以null结尾的字符添加1

char*
指针是一条信息,它显示字符串的起始位置。但它在哪里结束
strlen
和其他C函数不知道字符串的结尾,因此它们会遍历所有字符,直到遇到
'\0'
字符

为了提高效率,将strlen(输入)
从循环中取出,只计算一次:

void encryptDecrypt(char *input, char *output) 
{
    char key[] = { 'K', 'C', 'Q' };
    int keysize = sizeof(key);
    size_t i;
    size_t len = strlen(input);
    for(i = 0; i < len; i++) 
        output[i] = input[i] ^ key[i % keysize];
    output[len] = 0; //will be same as output[i] = 0; 
}
void encryptDecrypt(字符*输入,字符*输出)
{
字符键[]={K',C',Q'};
int keysize=sizeof(键);
尺寸i;
尺寸长度=标准长度(输入);
对于(i=0;i

函数
int main
应返回零。注意,按照现代标准,这种方法不能被描述为“加密”。您可以称之为“模糊处理”。

使用
malloc
进行动态内存分配。需要
#包括

如前所述,必须为结尾以null结尾的字符添加1

char*
指针是一条信息,它显示字符串的起始位置。但它在哪里结束
strlen
和其他C函数不知道字符串的结尾,因此它们会遍历所有字符,直到遇到
'\0'
字符

为了提高效率,将strlen(输入)
从循环中取出,只计算一次:

void encryptDecrypt(char *input, char *output) 
{
    char key[] = { 'K', 'C', 'Q' };
    int keysize = sizeof(key);
    size_t i;
    size_t len = strlen(input);
    for(i = 0; i < len; i++) 
        output[i] = input[i] ^ key[i % keysize];
    output[len] = 0; //will be same as output[i] = 0; 
}
void encryptDecrypt(字符*输入,字符*输出)
{
字符键[]={K',C',Q'};
int keysize=sizeof(键);
尺寸i;
尺寸长度=标准长度(输入);
对于(i=0;i

函数
int main
应返回零。注意,按照现代标准,这种方法不能被描述为“加密”。您可以称之为“模糊处理”。

char-encrypted[strlen(baseStr)]太小了。即使对于“Linux和gcc”,也可能是Visual Studio 2017,即使使用C编译的代码不支持VLAs。对于C11,VLA支持是可选的。使用C99,当它被引入时,需要VLA。这不是C++,它是C,它有VLAs,但是微软因多年落后于标准而臭名昭著。可能需要在某个地方设置一个标志来告诉编译器使用C99,或者它可能不支持C99。我想用C语言编程,使用像GCC这样的真正的编译器。事实上,我倾向于怀疑微软在委员会决定采取破坏兼容性的步骤,在C2011中使VLA支持成为可选的过程中发挥了影响力。微软一直更喜欢说服人们采用微软的惯例和惯例,而不是遵守或支持第三方的标准。不,微软在微软的VC中不支持VLAs,而且永远不会支持。
char-encrypted[strlen(baseStr)]太小了。即使对于“Linux和gcc”,也可能是Visual Studio 2017,即使使用C编译的代码不支持VLAs。对于C11,VLA支持是可选的。使用C99,当它被引入时,需要VLA。这不是C++,它是C,它有VLAs,但是微软因多年落后于标准而臭名昭著。可能需要在某个地方设置一个标志来告诉编译器使用C99,或者它可能不支持C99。我想用C语言编程,使用像GCC这样的真正的编译器。事实上,我倾向于怀疑微软在这方面有影响力