C - 从文件读取时导致分段错误的联合



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

相关内容

  • 没有找到相关文章

最新更新