为什么使用for循环和printf函数打印缓冲区中的字符时得到不同的结果?

问题描述 投票:0回答:1

我一直在练习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 循环,它打印了几乎所有字符,有些字符被遗漏了。

c debugging encryption printf
1个回答
0
投票

加密数据中的某些字符是空字符(值为零的字符)。当您的

for
循环遇到空字符时,它会打印它并继续。当
printf
遇到空字符时,它会停止。

printf
之所以这样设计,是因为
%s
用于打印C字符串,该字符串是一串字符,其末尾以空字符标记。您不能将
printf
%s
一起使用来打印包含内部空字符的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.