0

私の目標は、ファイルを入力として受け取り、文字を3つ先にシフトすることによってテキストを「エンコード」するプログラムを作成することです(したがって、「a」は「d」になります)。エンコードされたテキストを含む出力ファイルを生成する必要があります。メニューは、ユーザー入力を受け取り、選択した番号に割り当てられている機能を実行するためのものです。

私はこのプログラムを作成するのは早いですが、時間が足りず、プログラムの構成方法に苦労しています。現在、メニューを表示していますが、サブ関数を呼び出すと表示されますが、メニューが上書きされて理由がわかりません。どんな助けでもいただければ幸いです。これが私がこれまでに持っているコードです...

#include <stdio.h>
#define INPUT_FILE 1    //define statements
#define OUTPUT_FILE 2
#define NUM_TO_SHIFT 3
#define ENCODE 4
#define QUIT 0

int menu();     //function prototypes
int input();
int output();
int shift();
int encode();
void quit();

int main()
{
    int choice;     // main variables
    char user_filename[100];

    choice = menu();   // get user's first selection

    while(choice != QUIT)   //execute so long as choice is not equal to QUIT
    {
        switch(choice)
            {
                case INPUT_FILE:
                    printf("Enter the filename of the file to encode:\n");
                    printf("(hit the Enter key when done)\n");
                    gets(user_filename);
                    break;
                case OUTPUT_FILE: output();
                    break;
                case NUM_TO_SHIFT: shift();
                    break;
                case ENCODE: encode();
                    break;
                case QUIT: quit();
                    break;
                default:    printf("Oops! An invalid choice slipped through. ");
                            printf("Please try again.\n");
            }
      choice = menu(); /* get user's subsequent selections */
   }

   printf("Bye bye!\n");
   return 0;
}

int menu(void)
{
    int option;

    printf("Text Encoder Service\n\n");
    printf("1.\tEnter name of input file (currently 'Secret.txt')\n");
    printf("2.\tEnter name of output file (currently not set)\n");
    printf("3.\tEnter number of characters data should be shifted (currently +7)\n");
    printf("4.\tEncode the text\n\n");
    printf("0.\tQuit\n\n");
    printf("Make your selection: ");

    while( (scanf(" %d", &option) != 1) /* non-numeric input */
          || (option < 0)               /* number too small */
          || (option > 4))              /* number too large */
    {
      fflush(stdin);                    /* clear bad data from buffer */
      printf("That selection isn't valid. Please try again.\n\n");
      printf("Your choice? ");
    }
    return option;
}

int input()
{

}

int output()
{
    return 2;
}

int shift()
{
    return 3;
}

int encode()
{
    return 4;
}

void quit()
{
    printf("Quiting...Bye!");
    exit(0);
}
4

4 に答える 4

0

getchar();を使用します。get(user_filename);の直後 キャラクターを取得するのを待ちます

 gets(user_filename);
 getchar();
 break;
于 2012-08-14T04:49:33.993 に答える
0

aまで読み取り、読み取りを停止するgets(user_filename)ため、ファイル名の取得にを使用しないでください。ユーザーがメニューオプションを入力したときに、メニューオプションのは行末のを読み取りません。基本的に、単語を含まない文字列を読み取らせています。読みたい行は実際には次の行です。の代わりに使用すると修正されます。gets()\nscanf\ngetsscanfgets

それ以外の場合、プログラムは期待どおりに機能しています。メニューがサブメニューを「上書き」しているのは、関数がまだ何もしていないということだけです。の代わりにを使用した実装については、http://ideone.com/F2pEsを参照してください。scanfgets

于 2012-08-14T04:53:45.353 に答える
0

Stackoverflowが一致として強調表示したこの質問のように、そこで待機している改行を削除するには、バッファーをクリアする必要があります。

有効なメニューオプションを読んだ後、次のコードを追加します。

do
{
    c = getchar();
} while (c != EOF && c != '\n');

ここcで、はcharによって宣言されていoptionます。これは、(ファイルの終わり)または改行文字に到達するまで、入力ストリーム内の残りの文字をループしEOFます。つまり、への呼び出しには影響しませんgets()。バッファオーバーフローから保護されないため、安全でないと見なされることに注意してくださいgets()。ユーザーは100文字を超える文字(改行を含む)を簡単に入力して、入力に触れてはならないメモリへの書き込みを開始できます。このような関数呼び出しに関するコンパイラの警告が表示された場合は、安全な同等物を検索することをお勧めします。通常、これらの警告は、読み込まれるバッファの最大サイズである2番目のパラメータを取ります。

于 2012-08-14T04:59:22.590 に答える
0

ええと、この答えはかなり遅いですが、それに出くわしたので、私は何かを書かざるを得ません。まっすぐに行きましょう。メニューの配列があり、配列要素がメニューに必要なオプションです。次に、真の状態で、配列の要素をループして、必要なオプションを選択します。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
//function prototypes
int input();
int output();
int shift();
int encode();
void quit();
int main(){
int menus_on = 1;
  const char *menus[5] = {"Input","Output","Shift","Encode","Quit"};
  while(menus_on){
    int menu,*temp;

    for(int i =0;i<6;i++){
      printf("%d: %s\n",i,menus[i]);
    }
      printf("Select menu\n");
      scanf("%d",temp);
      menu = *temp;
      printf("Selected menu::%d\n",menu);
      switch(menu){
        case 0:
        input();
        break;
        case 1:
        output();
        break;
        case 2:
        shift();
        break;
        case 3:
        encode();
        break;
        case 4:
        quit();
        break;
        default:
        printf("Invalid selection\n");
        break;
      }
  }
  return 0;
}
int input() {
return 0;
}
int encode () {
return 0;
}
于 2017-04-07T12:18:45.357 に答える