我的main函数调用另一个函数,它的第一行是:
char input[1024];
printf("Please enter the difficulty level between [1-7]:\n");
fgets(input, 1024, stdin);
由于某种原因,fgets不会等待我的输入。
只是为了澄清 - 第一件事(除了初始化整数和类似的东西)是调用该函数。
并且我没有在整个代码中使用scanf。
可能是什么问题?谢谢!
编辑:
这是我的主要功能:
int main(){
int check = 0;
char input[1024];
int level = getLevel(); //get the difficulty level from the user
while ( level>7 || level<1 ) level = getLevel();
return level
}
这是getLevel函数:
int getLevel(){
int level = 1;
char input[1024];
bool isNum = true;
printf("Please enter the difficulty level between [1-7]:\n");
fgets(input, 1024, stdin); //gets the input from the user
isNum = InputIsInt(input);
if(!isNum){ //input is not a number
return 0;
}
level = atoi(input);
return level;
}
这是InputIsInt函数:(正常工作)
bool InputIsInt(const char* str){
if(!str ||!*str){
return false;
}
if(*str=='-'){//if the number is negative
++str;
}
while(((*str)!='\0')&&((*str)!='\n')){
if (!isdigit(*str)){
return false;
}
else{
++str;
}
}
return true;
}
并且,程序没有停止(因为getLevel函数一直返回0)。
另一个编辑:
似乎在终端中运行程序确实有效(fgets是&#34;等待&#34;对于我的输入)现在我按照建议更改了InputIsInt函数,程序按照我的意愿运行。
仅在终端中BUT 。当我尝试在IDE中运行它时(我使用Eclipse Neon),fgets仍然没有等待我的输入...... 有什么想法?
最后和最终编辑:
我尝试使用Virtual Studio而不是Eclipse Neon,它似乎解决了我的所有问题(关于这段代码,我的生活仍然是一团糟:))。
答案 0 :(得分:1)
您没有发布显示问题的完整程序。
如果您之前使用fgets()
或scanf("%d", ...)
解析了其他一些输入,则scanf("%s, ...)
不等待输入的可能原因很可能。尾部换行仍在stdin
缓冲区中待处理,由fgets()
读取,因此立即返回。
如果您不使用scanf()
,则可能是在stdin
绑定到空文件或封闭终端的环境中运行程序。有些IDE有这个问题,在终端窗口中运行程序。
在任何情况下,您都应该检查fgets()
的返回值。以下是代码的改进版本:
#include <errno.h>
#include <string.h>
#include <stdio.h>
int getLevel(void) {
char input[1024];
printf("Please enter the difficulty level between [1-7]:\n");
if (fgets(input, 1024, stdin) == NULL) {
fprintf(stderr, "fgets failed: %s\n", strerror(errno));
return 0;
}
if (!InputIsInt(input)) { //input is not a number
return 0;
}
return atoi(input);
}
bool InputIsInt(const char *str) {
if (!str || !*str) return false;
if (*str == '-') { //if the number is negative
++str;
}
size_t digits = strspn(str, "0123456789");
return (digits > 0 && (str[digits] == '\0' || str[digits] == '\n');
}
答案 1 :(得分:0)
这段代码可以独立工作,但是你可能从stdin与&#34; stdin&#34;不相符的上下文中运行。主程序。例如,如果你fork:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
int pid = fork();
if(pid == 0){
char input[1024];
printf("Please enter the difficulty level between [1-7]:\n");
fgets(input, 1024, stdin);
} else if (pid < 0) { /* checking for error */
; // error here
} else {
wait(NULL); // wait for child to return
}
return 0;
}
在上面的例子中,您正在从具有自己的stdin的子进程运行fgets。有一种方法可以通过在fork之前调用fgets来解决这个问题。
答案 2 :(得分:0)
只需在fgets()
之后添加即可if(input[strlen(input)-1]=='\n'){
input[strlen(input)-1]='\0';
}
在bool InputIsInt(const char* str){}
函数
if (!isdigit(str[i])){
return false;
}
在输入数组的最后一个元素上返回false,即 \ n (换行)。只需用 \ 0 (空字符)替换它。如果发现输入小于提供的范围(在本例中为1024), fgets()也会分配该换行符。如果用户输入的数字大于1024位,那就没关系。但是在fgets()之后检查新行字符总是一种很好的做法。
不要忘记包含 string.h