コマンドライン引数として、ファイル名、-d(復号化)又は-e (暗号化)、-n x(xはシフト量)、-f fname(読み込むファイルの名前、ない場合は標準入力で暗号化、または複合化したい文章を入力) を与え、暗号化、または複合化した文字列を返すプログラムを作りたいのですが修正をお願いいたします。ファイルに含まれる文字は全てアルファベットの大文字か小文字という前提です。文字をシフトするdo_shiftでポインタをうまく使えばよいとのことですが、わかりませんでした。また、ファイル名がない場合、標準入力をどのように実装すればいいかもよくわかっていません。 FILE *fp = stdin;ですでに実装されているのでしょうか?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void do_shift(int direction, int shift , char buf[]){
int len =0, i;
len == strlen(buf);
if(direction == 1){
for(i=0; i<len; i++){
buf[i] = tolower(buf[i]);
if(buf[i] + shift <= 'z'){
buf[i] += shift;
}else{
buf[i] += shift-26;
}
}
}
if(direction == -1){
for(i=0; i<len ; i++){
buf[i] = tolower(buf[i]);
if(buf[i] - shift >= 'a'){
buf[i] -= shift;
}else{
buf[i] -= shift+26;
}
}
}
}
void convert (int direction, int shift, FILE *fp ) {
char buf[10000];
while( fgets (buf,10000,fp)) {
do_shift(direction, shift ,buf);
printf("%s",buf);
}
}
int main(int argc, char *argv[]){
int i=0, direction=0, shift=0;
FILE *fp = stdin;
char *fname=NULL;
i = 1;
while(i < argc){
if (strcmp(argv[i], "-e") ==0){
direction = 1;
i += 1;
}
else if(strcmp(argv[i], "-d") ==0){
direction = -1;
i += 1;
}
else if(strcmp(argv[i], "-n") ==0){
if(i + 1 <argc){
shift = atoi(argv[i+1]);
i += 2;
}
else {
fprintf(stderr, "-n SHIFT\n");
exit(1);
}
}
else if(strcmp(argv[i], "-f") ==0){
if(i + 1 <argc) {
strcpy(fname ,argv[i+1]);
}
}
}
if (fname != NULL){
if((fp = fopen(fname, "r")) == NULL) {
printf("ファイルを開けません\n" );
exit(1); }
}
convert(direction, shift, fp);
fclose(fp);
return 0;
}