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