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

问题描述 投票:0回答:2

我尝试使用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中包含的构建工具。

我究竟做错了什么?

c compiler-errors visual-studio-2017
2个回答
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
投票

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

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

如前所述,您必须在末尾为以null结尾的字符添加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应该返回零。请注意,此方法不能被现代标准描述为“加密”。你可以称之为“混淆”。

© www.soinside.com 2019 - 2024. All rights reserved.