我对c相当陌生,并不完全确定文件操作是如何工作的。我已经设法做到了这一点,但我不断遇到分段错误,我可以弄清楚如何解决它,这是我的代码:
int main() {
int c;
char str[50];
FILE *file;
file = fopen("encrypt.txt", "r+");
if (file) {
while ((c = getc(file)) != EOF){
fseek(file, ftell(file)-1, SEEK_SET);
char d = getc(file);
union shift sh;
sh.str = d; //It worked until here
sh.i = sh.i+5;
str[c] = sh.str;
printf("%c", str[ftell(file)-1]);
}
fclose(file);
}
}
union shift {
int i;
float f;
char str;
};
我正在尝试从文件加密中读取.txt并使用联合将字符更改为整数,然后将其移回 5 并将其变回字符,将其保存在 str 中
编辑:我正在查看第一个while循环,并假设c是一个整数。我用 ftell(file(-1 替换了 c
不确定你想要实现什么,但看看str
的声明:
char str[50];
现在分配c
:
while ((c = getc(file)) != EOF){
然后分配到str[c]
str[c] = completely_irrelevant;
如果c > 49
(这是1
的代码(,您将越界访问str
,这就是为什么如果您的文件包含代码高于49
的字母,则会出现分段错误。
为避免这种情况,请制作
char str[255];
(一旦修复,你可能还需要对代码做一些工作,不,union
的使用与当前错误无关(
有问题的陈述是
str[c] = sh.str; /* it cause UB if c is greater than 49 */
就像你什么时候会做c = getc(file)
如果c
值大于49
,就像你声明的那样str
只有50
字符的数组,比如char str[50];
。为了避免这种情况,str
声明为
char str[255] = ""; /* initialize it */
另外,当您sh.i+5;
什么是sh.i
价值? 您没有union
变量。像下面这样初始化它以避免未定义的行为。
union shift sh = { 0 };