我在使新近启动的项目(甚至是初学者)无法正常工作时遇到了问题。 出于某种原因,我的交互式菜单中的第4个选项不起作用,仅采用默认路由(不输出文件内部内容(文件目录就可以了。)。
在这一点上,我已经阅读了每个论坛的答案,但是无法以任何可行的方式修改我的代码。 因此,我决定向您寻求帮助。 这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define kFileLocation "/Users/patrykpiwowarczyk/Desktop/STUDIA/FoCP/Kodowanie/TestProjektSemestralnyAngielski/TestProjektSemestralnyAngielski/authors.txt"
void options();
void start(void);
void score(void);
void optionz(void);
void author(void);
void pexit(void);
int main(void)
{
char ch;
int num;
char option;
while (1) {
printf("****Your English Learning Index Cards****\n\n");
printf("Enter 1-5 of the following options: \n\n");
options();
scanf("%c", &option);
switch (option) {
case '1':
break;
case '2':
break;
case '3':
break;
case '4':
author();
break;
case '5':
pexit();
break;
default:
printf("Please insert number ranging from 1-5 though... No cheating! \n\n");
printf("Press ENTER key to Continue\n");
}
}
return 0;
}
void options()
{
printf("1. Start Game \n");
printf("2. View Scoreboard \n");
printf("3. Options \n");
printf("4. Author \n");
printf("5. Exit \n\n");
}
void author()
{
char c;
FILE *authorsFile;
if ((authorsFile = fopen("/Users/patrykpiwowarczyk/Desktop/STUDIA/FoCP/Kodowanie/TestProjektSemestralnyAngielski/TestProjektSemestralnyAngielski/authors.txt","r")) == NULL)
{
printf("FAILED to read the file, maybe check directory?\n");
exit(1);
}
while ((c = fgetc(authorsFile)) != EOF)
{
printf("%c", c);
}
fclose(authorsFile);
}
void pexit()
{
puts("Your progress has been saved, see you next time.");
exit(0);
}
如果您能以任何方式帮助我,我将不胜感激。
问候,Patryk Piwowarczyk。
PS:#define kFileLocation是我其他尝试的剩余内容。忽略它。
答案 0 :(得分:0)
根据您的评论,我得出以下结论:
问题在于scanf首次调用该数字时,已正确将数字写入变量option
中。但是,第二次调用scanf时,它立即从上一个菜单选择中返回换行符,而不是等待用户输入其他数字。每当scanf返回换行符时,就会触发默认情况。
因此,可以通过将scanf调用更改为以下内容来最好地解决该问题:
scanf(" %c", &option);
通过在格式字符串的开头添加一个空格,可以指示scanf在读取字符之前先丢弃所有空白字符。这样,您可以确保不会将换行符写入option
变量中。
this question中已详细讨论了scanf读取换行符而不是丢弃换行符的问题。