打开 argv 提供的文件名时出现段错误,即使它存在于 argv 中
Segfault when opening filename provided by argv even though it exists in argv
我做了一个小的重复异或加密器。您可以使用您选择的键对您选择的字符串进行异或运算,它可以选择将其输出到文件中。
凡是运行程序用单字(无空格)字符串和键,都没有问题。但是,只要字符串或键中有空格,程序就会在 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;
}
输入:
./xor "multiple words in a sentence" "the Key" "file"
输出:
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)
我不知道这是否是答案,但您正在针对 stringlen 循环但填充缓冲区 [i]...缓冲区是 keylen 的大小,因此如果 stringlen > keylen 长度,您将得到一个错误。
我做了一个小的重复异或加密器。您可以使用您选择的键对您选择的字符串进行异或运算,它可以选择将其输出到文件中。
凡是运行程序用单字(无空格)字符串和键,都没有问题。但是,只要字符串或键中有空格,程序就会在 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;
}
输入:
./xor "multiple words in a sentence" "the Key" "file"
输出:
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)
我不知道这是否是答案,但您正在针对 stringlen 循环但填充缓冲区 [i]...缓冲区是 keylen 的大小,因此如果 stringlen > keylen 长度,您将得到一个错误。