【发布时间】:2020-07-05 02:01:48
【问题描述】:
我有一个关于从文件中解密秘密消息的作业。我需要读取文件并转换字符以进行解密,但我什至无法启动 decrypt_and_print(char*) 函数。为了测试它,我放置了控制线,但是当我运行代码时,它没有写任何东西,也没有完成过程。我不知道为什么会发生这种情况我在 c 有点新。这是我的代码:
#include <stdio.h>
void decrypt_and_print(char*);
int main(){
char* file_name = "/home/baran/hw4/encrypted_p1.img";
decrypt_and_print(file_name);
return 0;
}
void decrypt_and_print(char* file_name){
FILE *f = fopen(file_name,"r");
if(f == NULL){
printf("Couldn't open file!");
}else{
printf("File opened sucesfully!");
}
char a;
fscanf(f,"%ch",&a);
while(fscanf(f,"%ch",&a) == 1){
switch(a){
case '0':{printf(" ");break;}
case '1':{printf("-");break;}
case '2':{printf("_");break;}
case '3':{printf("|");break;}
case '4':{printf("/");break;}
case '5':{printf("\\");break;}
case '6':{printf("O");break;}
default:printf("\n");
}
}
}
【问题讨论】:
-
在这些调试字符串的末尾添加换行符以刷新输出。超级骗子:(
-
while(1)很好地表明您陷入了循环。fscanf可能没有读取任何数据(它已经到达文件末尾),并且 a 中剩余的值大于 6,因此没有一个案例被命中。检查 fscanf 返回的值。 -
很有可能名为
*.img的文件不是文本数据,因此将%d与scanf 一起使用是错误的读取方式。 -
您需要在您的案例中使用
break语句以避免失败。 -
啊。如果您的输入看起来像“111324”,那么带有 %d 的 scanf 将读取非常大的整数。你应该停止使用 scanf 而只使用
fgetc这样你一次只能读取一个字符。