代码之家  ›  专栏  ›  技术社区  ›  Winzer Prince

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

  •  0
  • Winzer Prince  · 技术社区  · 6 月前

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

    1 回复  |  直到 6 月前
        1
  •  1
  •   Eric Postpischil    6 月前

    加密数据中的一些字符是空字符(值为零的字符)。当你 for 循环遇到一个空字符,它会打印出来并继续。当 printf 遇到空字符时,它停止。

    输出函数 之所以这样设计,是因为 %s 用于打印C字符串,这是一个以空字符结尾的字符串。您不能使用 输出函数 具有 s 打印包含内部空字符的字符串。

    此外,直接打印加密数据中的字符是有问题的,因为一些字符是具有特殊含义的不可打印字符,并且它们可能无法通过处理标准输出的过程来保存,特别是当它被定向到终端时。它们应该以二进制模式写入文件或转换为显示( 例如 ,以十进制或十六进制显示其值,而不是直接打印)。