【问题标题】:Why does an output string show data I never wrote?为什么输出字符串显示我从未写过的数据?
【发布时间】:2012-11-16 01:42:31
【问题描述】:

我正在编写一个程序,通过在每个字符上加 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 是路径的一部分。这是怎么回事???

【问题讨论】:

    标签: c output


    【解决方案1】:

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

    使用freadfwrite

    【讨论】:

      【解决方案2】:

      线

      fputs(tmp,fp);
      

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

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

      【讨论】:

      • 你的解决方案有一些缺陷,看我的回答。
      【解决方案3】:

      很多东西:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 1970-01-01
        • 2021-10-25
        • 2021-02-26
        • 2020-08-21
        • 2021-11-08
        • 1970-01-01
        相关资源
        最近更新 更多