1

我正在编写一个程序,通过向每个字符添加 10 来加密文件。不知何故,程序工作目录的一部分被打印到文件中,我不知道为什么。

#include <stdio.h>
    int main(void){
        FILE *fp;
        fp=fopen("tester.csv","r+");
        Encrypt(fp);      
        fclose(fp);
    }

    int Encrypt(FILE *fp){
        int offset=10;
        Shift(fp, offset);
    }
    int Decrypt(FILE *fp){
        int offset= -10;
        Shift(fp, offset);
    }
    int Shift(FILE *fp, int offset){
        char line[50],tmp[50], character;
        long position;
        int i;
        position = ftell(fp);
        while(fgets(line,50,fp) != NULL){
            for(i=0;i<50;i++){
                character = line[i];
                character = (offset+character)%256;
                tmp[i] = character; 
                if(character=='\n' || character == 0){break;}                
            }
            fseek(fp,position,SEEK_SET);
            fputs(tmp,fp);
            position = ftell(fp);
            fseek(stdin,0,SEEK_END);
        }
      }

该文件最初读取

this, is, a, test
i, hope, it, works!

程序运行后:

~rs}6*s}6*k6*~o}~
/alexio/D~6*y|u}+
k6*~o}~
/alexio/D

其中 users/alexio/Desktop 是路径的一部分。这是怎么回事???

4

3 回答 3

5

因为您“编码”了字符串,所以它不会以空值结尾(这是你的情况),或者它甚至在字符串结尾之前包含空值(字符+偏移量 % 256 == 0)。稍后您尝试将其写为字符串,这会超出您的缓冲区,并输出您的程序参数的一部分。

使用freadfwrite

于 2012-11-16T01:49:57.967 回答
3

线

fputs(tmp,fp);

写出一个可能非空终止的字符串。因此它会继续将内存复制到文件中,直到找到空值。

如果循环在换行符处中断,您需要在“tmp”的末尾添加一个空值。

于 2012-11-16T01:49:24.750 回答
2

一些事情:

  1. 您正在对读取缓冲区中的所有 50 个字符进行编码,无论实际使用fgets(). 回想一下,fgets()读取的是一行,而不是整个缓冲区(除非该行比缓冲区长,而你的不是)。行文件输入中超过字符串长度的任何内容都是堆栈垃圾。

  2. 然后,您将转储所有额外的垃圾数据,并且除此之外,tmp[]在写入之前不终止您的字符串,fputs()无论如何您都不应该使用它。还有更多的堆栈垃圾。

解决方案。使用fread()andfwrite()进行这种编码。没有任何理由使用字符串函数。当您编写解码器时,您会感谢自己使用fread()fwrite()

于 2012-11-16T01:52:10.237 回答