我想的是 输入一个文件中的内容 然后读取内容并输出每个字母出现的频率 然后再让使用者 输入一个shift(例如‘1’那么就是吧‘a'变成’b'或‘f'变成’g'),然后输出解码之后的文章 下面是我的程序 但是输出的时候会出现segmentation fault的错误 小弟看了好久也没明白错误出在哪里 求指教
#include <stdio.h>
#include <ctype.h>
void count_freq(int count[] );
void print_freq(int count[] );
int rotate_left(int ch);
int rotate_right(int ch);
int encode(int ch , int shift);
int main(int argc, char *argv[])
{
FILE *fp;
int count[26] = { 0 };
int ch;
int shift;
fp = fopen(argv[1],"r");
while(( ch = getc(fp)) != EOF ) {
count_freq( count );
}
print_freq( count ); fclose(fp);
printf("Enter your best guess of shift: ");
scanf("%d",&shift);
fp = fopen(argv[1],"r");
while(( ch = getc(fp)) != EOF ) {
encode(ch,shift);
} return 0;
} void count_freq( int count[] )
{
int ch;
int i; while(( ch = getchar()) != EOF ) {
ch = toupper( ch );
if(( ch >= 'A' )&&( ch <= 'Z' )) {
i = ch - 'A';
count[i]++;
}
}
} void print_freq( int count[] )
{
double total = 0.0;
int i; for( i=0; i < 26; i++ ) {
total += count[i];
}
for( i=0; i < 26; i++ ) {
printf( "%c: %5d [%1.1f",'A'+i,count[i],count[i]*100.0/total);
putchar('%');
printf("]\n");
}
} int rotate_right( int ch ) {
if (ch >='A' && ch <='Z') {
ch =(ch-'A'+ 1) % 26 + 65;
}
else if (ch >='a' && ch <='z') {
ch = (ch -'a'+ 1) % 26 + 97;
}
return ch;
} int rotate_left ( int ch ) {
if (ch >='A' && ch <='Z') {
ch = (ch - 65 - 1 + 26) % 26 + 65;
}
else if (ch >='a' && ch <='z') {
ch=(ch - 97 - 1 + 26) % 26 + 97;
}
return ch;
} int encode( int ch , int shift) {
int n;
if (shift > 0) {
for (n = 1;n <= shift;n++) {
ch = rotate_right(ch);
}
}
else if (shift < 0 ) {
for (n =-1;n >= shift;n--) {
ch = rotate_left(ch);
}
}
else {
ch = ch;
}
putchar(ch);
return ch;
}
#include <stdio.h>
#include <ctype.h>
void count_freq(int count[] );
void print_freq(int count[] );
int rotate_left(int ch);
int rotate_right(int ch);
int encode(int ch , int shift);
int main(int argc, char *argv[])
{
FILE *fp;
int count[26] = { 0 };
int ch;
int shift;
fp = fopen(argv[1],"r");
while(( ch = getc(fp)) != EOF ) {
count_freq( count );
}
print_freq( count ); fclose(fp);
printf("Enter your best guess of shift: ");
scanf("%d",&shift);
fp = fopen(argv[1],"r");
while(( ch = getc(fp)) != EOF ) {
encode(ch,shift);
} return 0;
} void count_freq( int count[] )
{
int ch;
int i; while(( ch = getchar()) != EOF ) {
ch = toupper( ch );
if(( ch >= 'A' )&&( ch <= 'Z' )) {
i = ch - 'A';
count[i]++;
}
}
} void print_freq( int count[] )
{
double total = 0.0;
int i; for( i=0; i < 26; i++ ) {
total += count[i];
}
for( i=0; i < 26; i++ ) {
printf( "%c: %5d [%1.1f",'A'+i,count[i],count[i]*100.0/total);
putchar('%');
printf("]\n");
}
} int rotate_right( int ch ) {
if (ch >='A' && ch <='Z') {
ch =(ch-'A'+ 1) % 26 + 65;
}
else if (ch >='a' && ch <='z') {
ch = (ch -'a'+ 1) % 26 + 97;
}
return ch;
} int rotate_left ( int ch ) {
if (ch >='A' && ch <='Z') {
ch = (ch - 65 - 1 + 26) % 26 + 65;
}
else if (ch >='a' && ch <='z') {
ch=(ch - 97 - 1 + 26) % 26 + 97;
}
return ch;
} int encode( int ch , int shift) {
int n;
if (shift > 0) {
for (n = 1;n <= shift;n++) {
ch = rotate_right(ch);
}
}
else if (shift < 0 ) {
for (n =-1;n >= shift;n--) {
ch = rotate_left(ch);
}
}
else {
ch = ch;
}
putchar(ch);
return ch;
}