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

正如在 Stackoverflow突出显示为匹配项的问题中一样,您需要清除缓冲区以删除在那里等待的换行符。

阅读有效的菜单选项后添加此代码:

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

哪里c是 achar声明的option。这会循环输入流中的剩余字符,直到到达EOF(End Of File) 或换行符,这意味着它们不会影响您对gets(). 请注意,这gets()被认为是不安全的,因为它不能防止缓冲区溢出,用户可以轻松输入超过 100 个字符(包括换行符)并开始写入不应被他们的输入触及的内存。当您看到像这样的函数调用周围的编译器警告时,您最好查找安全等效项,通常它们采用第二个参数,该参数是被读入的缓冲区的最大大小。

于 2012-08-14T04:59:22.590 回答
0

使用 getchar(); 在获取(用户文件名)之后不久;它将等待获得角色

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

您不应该使用gets(user_filename)来获取文件名,因为gets()读取到 a\n并停止读取。当用户键入菜单选项时,您scanf的 for menu 选项不会读取行尾的 。\n本质上,您正在gets读取一个没有单词的字符串。您阅读的行实际上是下一行。使用scanf而不是gets将修复它。

否则,您的程序将按预期工作 - 只是您的功能尚未执行任何操作,您的菜单正在“覆盖”子菜单。请参阅http://ideone.com/F2pEs了解使用scanf而不是gets.

于 2012-08-14T04:53:45.353 回答
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 回答