我想编写从in.txt读取的简单加密文本系统,然后写入out.txt 加密类型是每个ascii加五,如果char btw u和z,u = a,v = b,......,z = f哪里是我的问题? 此外,我们可以使用模运算符(%)代替(char-20)如果char btw u和z,u = a,v = b,......,z = f哪里是我的问题? 我的代码在下面谢谢你们所有赞赏的答案。 text在in.txt中测试abcde
#include <stdio.h>
int main(){
char ch;
int st;
FILE *fptr_in;
FILE *fptr_out;
fptr_in=fopen("in.txt","r");
fptr_out=fopen("out.txt","w");
if(fptr_in== NULL || fptr_out==NULL)
printf("File cannot be opened\n");
else{
st=(fscanf(fptr_in,"%c",&ch));
while(st==1){
/* for(st=(fscanf(fptr_in,"%c",&ch));
st==1;
st=(fscanf(fptr_in,"%c",&ch)))*/
st=(fscanf(fptr_in,"%c",&ch));
if('a'<=ch && ch<='z'){
fscanf(fptr_in,"%c",&ch);
if(ch==' ')
fprintf(fptr_out, "%c", ' ');
else if('u'<=ch && ch<='z')
fprintf(fptr_out, "%c", (char)((int)ch-20));
else
fprintf(fptr_out, "%c", (char)((int)ch+5));
}
}
}
fclose(fptr_in);
fclose(fptr_out);
return 0;
}
答案 0 :(得分:0)
对您的代码的一些评论:
fopen
后检查文件指针是件好事,但如果无法打开它们,则应该退出程序。否则,输入while
循环并在空指针上调用fscan
。您可以使用exit(1)
中的<stdlib.h>
。 (这几乎就像从main
返回1,但可以从任何地方调用。)fscanf(f, "%c", &ch)
最好呈现为ch = getc(f)
。同样,fprintf(f, "%c", ch)
可以更简洁地写为putc(ch, f)
。 (在我看来,你的变体不是很糟糕,但不必刻意罗嗦。)下面是一个有效的实施方案。注意事项:
getc
,这需要ch
为int。for(;;)
的无限循环中完成的。读取break
时,循环以EOF
语句结束。 (Ii通常更好地拥有具有适当条件的循环,但在这种情况下我更喜欢break
,因为它允许我在此循环中使ch
本地化,并且在条件中也不需要赋值,我觉得很难看。以下是示例:
#include <stdlib.h>
#include <stdio.h>
#define INFILE "in.txt"
#define OUTFILE "out.txt"
int caesar(int ch, int shift)
{
while (shift < 0) shift += 26;
if ('a' <= ch && ch <= 'z') return ('a' + (ch - 'a' + shift) % 26);
if ('A' <= ch && ch <= 'Z') return ('A' + (ch - 'A' + shift) % 26);
return ch;
}
int main()
{
FILE *fptr_in;
FILE *fptr_out;
fptr_in = fopen(INFILE, "r");
if (fptr_in == NULL) {
fprintf(stderr, "Can't open %s.\n", INFILE);
exit(1);
}
fptr_out = fopen(OUTFILE, "w");
if (fptr_in == NULL) {
fprintf(stderr, "Can't create %s.\n", OUTFILE);
exit(1);
}
for (;;) {
int ch = getc(fptr_in);
if (ch == EOF) break;
putc(caesar(ch, 5), fptr_out);
}
fclose(fptr_in);
fclose(fptr_out);
return 0;
}