我对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;
};
我试图从文件ecrypt.txt中读取并使用union将char更改为int。然后它将int移动5并将其变回char,将其保存在str
中编辑:我正在查看第一个while循环,并假设c是一个int。我用ftell(文件)-1替换了c
答案 0 :(得分:0)
不确定您想要实现的目标,但请查看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
的使用与当前错误无关)
答案 1 :(得分:0)
有问题的陈述是
str[c] = sh.str; /* it cause UB if c is greater than 49 */
当你c = getc(file)
宣布c
仅为49
字符的数组str
时,50
的值大于char str[50];
1}}。为避免这种情况,请将str
声明为
char str[255] = ""; /* initialize it */
当您执行sh.i+5;
sh.i
值是什么时?你没有union
变量。像下面一样初始化它以避免未定义的行为。
union shift sh = { 0 };