- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我意识到有人提出并回答了类似的问题。但是在搜索它们之后,我仍然没有真正找到解决我遇到的问题的方法。
显然我是 C 的新手。
我读到 fflush() 不适合用于刷新缓冲区,因为它的结果不确定,具体取决于环境。
我得到的是一个菜单,它将执行流程定向到不同的功能,用户可以选择该功能。这会成功运行,直到在正确选择菜单后,执行流程被定向到另一个功能,然后返回主菜单。
这是我得到的...
int main ( void )
{
Menu();
return 0;
}
void Menu()
{
printf( "\n" );
printf( "1. Enter data\n" );
printf( "2. Display data\n" );
printf( "3. Quit\n" );
ValidateChoice();
return;
}
void ValidateChoice()
{
char choice = '\0';
do
{
printf( "\nChoice: " );
choice = GetChoice();
switch (choice)
{
case '1':
EnterData();
break;
case '2':
DisplayData();
break;
case '3':
printf( "\nQuit\n" );
break;
default:
break;
}
while (getchar() != '\n');
}
while (choice != '3');
}
char GetChoice()
{
char choice[CHOICE_LENGTH];
char firstChar;
fgets(choice, CHOICE_LENGTH, stdin); /*readline into string */
sscanf(choice, "%c", &firstChar); /* get the first char of the string */
return (firstChar);
}
void EnterData()
{
printf( "\nEnterData() called\n" );
Menu();
return;
}
void DisplayData()
{
printf( "\nDisplayData() called\n" );
Menu();
return;
}
如果我不在 EnterData() 中调用 Menu(),它工作正常;继续提示选择(在 getChoice() 中)。
我该怎么做才能让流从 GetChoice 流出,进入另一个函数,然后返回到 Menu(),而不会在缓冲区中留下一堆字符?
如果有人可以解释我做错了什么,我需要在哪里放置额外的循环来捕获多余的数据,并举一两个例子,我将不胜感激。
(或者用解决方案向我指出帖子的方向!)
非常感谢。
最佳答案
似乎发生的情况是,您每次做出选择时都在不断调用新方法,而不是返回到第一个 Menu()
调用,在我看来这应该是理想的。我们可以顺着执行流程看清楚这一点。
假设 main
调用 Menu
,我们有:
main
Menu
ValidateChoice
GetChoice (assume you return 1)
EnterData
Menu
ValidateChoice
GetChoice
EnterData
Menu
....
这解释了为什么您必须多次按 3 才能最终退出程序,或者基本上返回到主程序。
解决此问题的一种方法是让您的 ValidateChoice
返回 1
或 0
(对于有效选择或退出),并保持Menu
方法中的一个循环来验证这一点。
例如:
void Menu(void)
{
do
{
printf( "\n" );
printf( "1. Enter data\n" );
printf( "2. Display data\n" );
printf( "3. Quit\n" );
} while (ValidateChoice());
return;
}
并且有如下ValidateChoice
:
int ValidateChoice()
{
char choice = '\0';
printf( "\nChoice: " );
choice = GetChoice();
switch (choice)
{
case '1':
EnterData();
break;
case '2':
DisplayData();
break;
case '3':
printf( "\nQuit\n" );
return 0;
default:
break;
}
return 1;
}
关于c - 用于输入的 fgets()/sscanf 在功能上运行良好。当 fnct 离开并返回时,stdin 中是否有额外的输入/行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21583082/
我意识到有人提出并回答了类似的问题。但是在搜索它们之后,我仍然没有真正找到解决我遇到的问题的方法。 显然我是 C 的新手。 我读到 fflush() 不适合用于刷新缓冲区,因为它的结果不确定,具体取决
我是一名优秀的程序员,十分优秀!