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

时间:2017-12-19 20:49:10

标签: c compiler-errors visual-studio-2017

我尝试使用C学习XOR算法。我在KyleBank's GitHub找到了一个很好的例子:

#include <stdio.h>
#include <string.h>

void encryptDecrypt(char *input, char *output) {
    char key[] = {'K', 'C', 'Q'}; //Can be any chars, and any size array

    int i;
    for(i = 0; i < strlen(input); i++) {
        output[i] = input[i] ^ key[i % (sizeof(key)/sizeof(char))];
    }
}

int main (int argc, char *argv[]) {
    char baseStr[] = "kylewbanks.com";

    char encrypted[strlen(baseStr)];
    encryptDecrypt(baseStr, encrypted);
    printf("Encrypted:%s\n", encrypted);

    char decrypted[strlen(baseStr)];
    encryptDecrypt(encrypted, decrypted);
    printf("Decrypted:%s\n", decrypted);
}

以上在Linux和gcc下运行良好。 但是,它不能在Windows下的Visual Studio中编译。

enter image description here

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

我做错了什么?

2 个答案:

答案 0 :(得分:3)

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

在这种情况下,可能会声明decryptedencrypted

char encrypted[sizeof(baseStr)] ;
...
char decrypted[sizeof(baseStr)] ;

encryptDecrypt()因此修改了:

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

...

    output[i] = 0 ;
}

最后,可以通过将i声明为size_t类型来清除签名的不匹配警告。

在Windows上,当然如果你想要更现代的C支持,你总是可以使用MinGW / GCC。或者如果你想坚持使用微软的编译器,你可以使用C ++和std::stringstd::vector容器。

答案 1 :(得分:1)

使用malloc进行动态内存分配。需要#include <stdlib.h>

char baseStr[] = "123";
char *encrypted = malloc(strlen(baseStr) + 1);
...
free(encrypted);

如前所述,您必须在末尾为空终止字符添加1。

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

为提高效率,请将strlen(input)从循环中取出并仅计算一次:

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; 
}

函数int main应返回零。请注意,此方法不能被现代标准描述为“加密”。你可以称之为“混淆”。