打开由argv提供的文件名时出现段错误,即使该文件存在于argv中

Ann*_*inC 0 c fopen segmentation-fault

我做了一些重复的XOR加密器。您可以使用选择的密钥对选择的字符串进行异或运算,然后有选择地将其输出到文件中。

只要使用单个单词(无空格)的字符串和键来运行程序,就不会出现问题。但是,只要字符串或键中有空格,程序就会在该fopen行上出现段错误(即使argv [3]是实际的文件名,我还是用print语句检查了它)。

为什么这样做呢?

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

int main(int argc, char const *argv[]){
    int file=0;

    switch(argc){
        case 3:
            break;
        case 4:
            file = 1;
            break;
        default:
            printf("Repeating XOR encryption. Usage:\n./xor \"Your string\" \"Your key\" \"Output filename\" (optional last parameter)");
            return 1;
    }

    const char* string = argv[1];
    const char* key = argv[2];

    int keylen = strlen(key);
    int stringlen = strlen(string);

    unsigned char buffer[keylen];

    unsigned char stringbyte;
    unsigned char keybyte;
    unsigned char newbyte;

    for(int i=0; i<stringlen; i++){
        stringbyte = string[i];
        keybyte = key[i%keylen];
        newbyte = stringbyte ^ keybyte;
        buffer[i] = newbyte;
        printf("%04d: %c^%c=%02hhx\n", i, stringbyte, keybyte, newbyte);
    }

    if(file){
        FILE *fptr;
        fptr = fopen(argv[3],"wb");
        fwrite(buffer, 1, stringlen, fptr);
        fclose(fptr);
    }else{
        for(int i=0; i<stringlen; ++i){
            printf("%c", buffer[i] );
        }
    }

    printf("\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输入:

./xor "multiple words in a sentence" "the Key" "file"
Run Code Online (Sandbox Code Playgroud)

输出:

0000: m^t=19
0001: u^h=1d
0002: l^e=09
0003: t^ =54
0004: i^K=22
0005: p^e=15
0006: l^y=15
0007: e^t=11
0008:  ^h=48
0009: w^e=12
0010: o^ =4f
0011: r^K=39
0012: d^e=01
0013: s^y=0a
0014:  ^t=54
0015: i^h=01
0016: n^e=0b
0017:  ^ =00
0018: a^K=2a
0019:  ^e=45
0020: s^y=0a
0021: e^t=11
0022: n^h=06
0023: t^e=11
0024: e^ =45
0025: n^K=25
0026: c^e=06
0027: e^y=1c
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

Dan*_*ase 7

我不知道这是否是答案,但是您正在针对stringlen进行循环,但要填写buffer [i] .... buffer是keylen的大小,因此,如果stringlen> keylen length,您会遇到问题。