fgets()不会等待使用Eclipse-neon

时间:2017-06-24 18:54:21

标签: c eclipse eclipse-neon

我的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,它似乎解决了我的所有问题(关于这段代码,我的生活仍然是一团糟:))。

3 个答案:

答案 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