2012-05-04 48 views
1

我正在尝试使简单的加密算法。我的目标是将abc(可以是任何单词)转换为123.然后应用一些函数,然后再次转换为文本,这里是我的算法。关于filing.I创建unencrypted.txt这是写在“你好世界”,然后调试程序它创建encrypted.txt,但只写worl d.Why它不会写你好world.always需要最后一个词和空间“世界”,你可以帮我吗?在C编程中提交

编辑 https://www.dropbox.com/s/i3afkm439iv3d0v/last%20form.txt这是最后的表格我添加multply 2和国防部27 encryption.it工作better.but仍然problem.there是“世界你好”在TXT file.its加密 pjxxcpjxxcpjxxcpjxxcscixhpjxxcqscixhqpjxxc scixh 但是它必须是是pjxxc scixh

#include <cstdlib> 
    #include <iostream> 
    #include<stdio.h> 
    #include<string.h> 
    #include <conio.h> 



    int main() 
    { 
     int g,p,sak,v,r,t,z,o,c,l,i,j,k,*D; 


    char alfabe[27]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','\0'}; 
    FILE *fp1; 
    FILE *mat; 
     char word[20]; 

     fp1 = fopen("unencrypted.txt","r"); 
     do { 
      g = fscanf(fp1,"%s",word); /* dosyadan bir kelime oku... */ 
      if (g != EOF) { 
       mat=fopen("encrypted.txt","w") ; 


     c=strlen(word); 
     printf("has %d letters ", c); 
     D = (int *) malloc(sizeof(int)*c); 
     for(i=0;i<c;i++) { 
      for(j=0;j<26;j++) { 
       if(word[i]==alfabe[j]) { 
        D[i]=(j+1); 

        break; 
       } 
      } 
     } 




     printf("\nlast form before translation "); 
     for(l=0;l<c;l++) { 
      printf("%d",D[l]); /*it s just for control */ 

     } 
     for(z=0;z<c;z++){ 

          o=D[z]; 
          word[z]=alfabe[o-1] ; } 





     printf("\nnew form of word: "); 
     for(k=0;k<c;k++) { 

      fprintf(mat," %c",word[k]); 

     } 
    fclose(mat); 
    } 


    } while (g != EOF);   
     fclose(fp1); } 
+0

与您的问题无关,但您使用O(n)算法,其中O(n)容易完成:创建一个将字符映射到其数字表示(快速版isaplha()大多数C库都这样做,所以看那里)。 – tbert

回答

0

要打开的文件内循环写。

+0

我删除了{ } while(g!= EOF); 这部分,但它再次只是采取世界 – allstar

0

它这样做,因为你是在“W”写模式打开的文件,所以它会清除以前的内容。尝试以“a +”模式打开它。

+0

我改变了+现在它写了2次你好 – allstar

2

为什么它不写hello world?

你打开在文件每次做的,而循环:

  mat=fopen("encrypted.txt","w") ; 

所以每次的内容将被覆盖。结果,你只能写下最后一个字。因此,“你好”消失了。

只是书面世界

因为,你用在fprintf中的空白:

fprintf(mat," %c",word[k]); 

要解决这个问题:

  1. 打开文件只有一次。
  2. 删除fprintf的空格。 fprintf(mat,“%c”,单词[k]);其结果是,循环的每次迭代都会擦掉旧文件内容

    do { 
        ... 
        mat=fopen("encrypted.txt","w") ; 
        ... 
        // writing to file 
        ... 
        } while(g != EOF); 
    

+0

https://www.dropbox.com/s/i3afkm439iv3d0v/last%20form.txt这是我最后一种形式添加multis2和mod 27加密。它的作品better.but仍然problem.there是“世界你好”在TXT file.its加密 pjxxcpjxxcpjxxcpjxxcscixhpjxxcqscixhqpjxxc scixh 但它必须是pjxxc scixh – allstar

+0

用GDB和步进式。查看原始字符数组中每个字母的加密字的值。 –

0

您使用fscanf(...,"%s",...);

现在是错误的,原因很简单,不管你的缓冲区有多大,输入可以始终是一个字节长。

由于您一次处理输入的一个字符,因此您应该一次读取一个字符。

疯狂的循环

我敢肯定你的意思是写D[i] = word[i]-'a';,再加上你应该测试如果字符是小字母字符使用islower()

o=D[z]; word[z] = alfabe[o-1];

现在这并没有太大的意义。如果字符是a?您将访问alfabe[-1]