当stdin结束时,fgets应该停止

时间:2015-03-28 05:45:58

标签: c stdin fgets

我尝试使用fgetsstdin读取,但是在小块中。我的问题是,我不确定在标准时间结束时fgets等于什么。从我的代码来看,它似乎显然不是NULL或像\n那样的另一端。这样做的正确方法是什么?

代码(永远循环,因为fgets永远不等于NULL):

int main () 
{   
    char str1[4];
    printf("Enter stuff: ");

    while (fgets(str1, sizeof str1, stdin) != NULL && 
           fgets(str1, sizeof str1, stdin) != "\n") {

        printf("Got here");
    }

    printf("%s\n",str1);
    return 0;
}

3 个答案:

答案 0 :(得分:0)

更改

while(fgets(str1, sizeof str1, stdin) != NULL && fgets(str1, sizeof str1, stdin) != '\n'){

while(fgets(str1, sizeof str1, stdin) != NULL){

while(fgets(str1, sizeof str1, stdin)){

fgets返回char*。您无法将其与'\n' char进行比较。此函数在遇到NULL时返回EOF。您可以按

EOF上模拟stdin
    Windows上的
  • CTRL + Z
  • Linux上的
  • CTRL + D

答案 1 :(得分:0)

你可以这样做:

while (fgets(str1, sizeof str1, stdin) != NULL && str1[0] != '\n')

如果fgets()读取换行符,则会将其存储在字符串中,如果遇到NULL则返回EOF。 这样您就可以获得输入并测试fgets()首先遇到EOF,然后测试字符串中的第一个字符(str1[0])以查看它是否是换行符。
请记住fgets()会返回char *,因此您可以使用指针表示法*str1或数组表示法str1[0]来测试字符串的第一个字符。

答案 2 :(得分:-1)

// Rajat Sewal #include <stdio.h> #include <stdlib.h> #include <string.h>    typedef struct island {    char *name;    char *opens;     char *closes;     struct island *next;    } island;

int main() {    printf("This is an example of linked lists using a file to read the data needed!\n");     printf("to create the structs dynamically!\n\n\n");     // First we need a function called island that creates the new island struct     /********************************************/     island* create(char *name)     {        island *i = malloc(sizeof(island));        // set the fields on the new struct        i->name = strdup(name); // strdup duplicates the string so a NEW copy is used        i->opens = "09:00";        i->closes = "17:00";        i->next = NULL;        return i;    }    /********************************************/    void display(island *start)    {        island *i = start;        for (;i !=NULL; i = i->next) { printf("Name: %s \n Open: %s-%s\n\n\n", i->name, i->opens, i->关闭);     } } / ****************************************** ****** /`

`island *start = NULL;`
`island *i = NULL;`
`island *next = NULL;`
`int j;`
`char name[80];`
`printf("Enter ^Z to finish [in windows]\n");`
`printf("Enter the names of the island you want to create:");`
`for(; (fgets(name, 80, stdin)!= NULL); i = next) {`
    `printf("Enter the next name of the island you want to create:");`
    `next = create(name);`
   ` if (start == NULL)`
       ` start = next;`
   ` if (i != NULL)`
        `i->next = next;`
`}`
`display(start);`
`return 0;`

}