用C表示Ceasar的代码

时间:2014-06-26 20:30:17

标签: c arrays file wrapping

嘿,上次我发布的帖子我有点草率。希望这次它看起来好多了。感谢您的时间,如果您决定帮助我。我真的需要它。无论如何,这是一个问题。我需要为我的代码换行,我听说你可以用模数来做,但我不确定我做得对,因为我没有得到正确的结果。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main () {
   char s[200]; //blank array//
   int mess;
   printf("Generations have wondered how the Ceasar Code works\n");
   printf("Please choose a number to mess up (encode) the current file\n");
   scanf("%d", &mess);
   mess = mess % 26;
   FILE *ptof = fopen("Rock.txt", "r");
   char a[200];//fill array with characters from file//
   int i=0;
   while( (a[i++]=fgetc(ptof)) != EOF && i < 89) { //get character from file//
   }
   a[i] = '\0'; /* null-terminate the string */
   i = 0;

   do{
      printf("%c",a[i++]);
   } while  (a[i] != '\0'); /* print until hit \0 */
   int j = 0;
   for (j = 0; j < 89; j++){
      s[j] = a[j] + mess;
   }
   printf("%s\n", s);

   fclose(ptof);
   return 0;
}

2 个答案:

答案 0 :(得分:3)

s[j] = a[j] + mess也需要模运算

答案 1 :(得分:1)

这里有很大的改进空间。您真的想将可打印字符映射到(可能)不可打印的字符吗?或者你只是想对字母表中的字母做一个ceaser转换?为什么输入的任意限制为90个字符?使用scanf从来都不是一个好主意(在20年的几年里编写代码,我从未离开学校就从未使用过它)。传递stdin而不是作为参数的转换使得很难将程序用作过滤器。例如,如果你可以取一个字符串并将它移动4,然后移13,然后移9,那将是非常好的,看看你得到原始文本。 (例如< file ceaser 4 | ceaser 13 | ceaser 9 | diff - file应该报告没有差异)。

以下是一些想法:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

FILE *
xfopen( const char *path, const char *mode )
{
        FILE *ifp = fopen( path, mode );
        if( ifp == NULL ) {
                perror( path );
                exit( 1 );
        }
        return ifp;
}

int
main( int argc, char **argv )
{
        int mess = argc > 1 ? strtol( argv[1], NULL, 10 ) % 26 : 13;
        FILE *ptof = argc > 2 ? xfopen( argv[2], "r" ) : stdin;
        int c;

        while( ( c = fgetc( ptof )) != EOF ) {
                if( isupper( c ))
                        c = 'A' + ( c - 'A' + mess ) % 26;
                if( islower( c ))
                        c = 'a' + ( c - 'a' + mess ) % 26;
                putchar( c );
        }
        return 0;
}