我一直在练习C,所以我认为制作一个文件加密和解密程序是一个很好的实践。但是,当我正在研究在终端上显示文件内容的加密形式的问题时,我遇到了显示的挑战我存储在终端缓冲区中的字符,使用 printf 函数时显示的值似乎不完整,当我使用 for 循环迭代并打印缓冲区中的每个字符时,某些字符最终被忽略。我尝试过调试,但几乎没有任何进展。如果有人能让我知道出了什么问题,我将非常感激。
#include <stdio.h>
#include <stdbool.h>
void encrypt(char* path );
void decrypt(char* );
int main(void){
char input;
printf("Hello, please enter the path of the file you want to encrypt\n");
char path[1024];
scanf("%s",path);
printf("File Path:%s\nFile encrypted content: ",path);
FILE *file = fopen(path, "r+");
if(file==NULL){
printf("Cannot open file \n");
system("pause");
return 1;
}
int ch;
int count = 0;
char buffer[1024];
while((ch=fgetc(file))!= EOF){
int hc = (ch + (count*2))%128;
printf("Original character: %c (ASCII value: %d) ", ch, ch);
buffer[count] = hc;
count++;
printf("Encrypted character: %c (ASCII value: %d)\n ", hc, hc);
if (count >= sizeof(buffer)-1){
printf("Buffer size exceeded");
break;
}
}
buffer[count] = '\0';
printf("This is the complete buffer\n\n");
for(int i=0; i<= count; i++){
printf("%c", buffer[i]);
}
printf("\nThis is the buffer printed as a string %s", buffer);
fclose(file);
system("pause");
return 0;
}
我最初使用大约三个单词的简单文本文件作为输入来运行该程序,但是当打印出加密字符时,它们比预期要少。我尝试在加密循环运行时以其加密形式打印每个字符,结果没问题。缓冲区中存储的所有值均已成功加密。但是当我尝试使用 printf 打印缓冲区中的值时,问题仍然存在。我尝试使用 for 循环,它打印了几乎所有字符,有些字符被遗漏了。
加密数据中的某些字符是空字符(值为零的字符)。当您的
for
循环遇到空字符时,它会打印它并继续。当 printf
遇到空字符时,它会停止。
printf
之所以这样设计,是因为%s
用于打印C字符串,该字符串是一串字符,其末尾以空字符标记。您不能将 printf
与 %s
一起使用来打印包含内部空字符的字符串。