fgets被跳过/没有停止输入

时间:2018-01-24 10:40:55

标签: c while-loop command-line-interface fgets

我正在尝试在简单的while循环中使用fgets。 fgets只是没有被召唤。

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LINE_BUFF 20
#define OSPID //Here is where I would put the ospid I was interested in

int readContentsOfProcessMapsFile(int target);


int main(int argc, char** argv) {

char lineprompt[LINE_BUFF];
char command1[LINE_BUFF], command2[LINE_BUFF];
int flag;


if( readContentsOfProcessMapsFile(OSPID) != 0)
{
    printf("Error reading file");
    exit(EXIT_FAILURE);
}

while(1) {

    fflush(stdout);
    printf("enter name:>");
    if ( fgets(lineprompt, sizeof(lineprompt), stdin) == NULL)
    {
        printf("Error using fgets\n");
        break;
    }

    sscanf(lineprompt, "%s %s", &command1, &command2);

    if (strcmp(command1, "show") == 0)
    {
        if( (strcmp(command2, "active") == 0) )
        {
            flag = 1;
        }
        else if( (strcmp(command2, "inactive") == 0) )
        {
            flag = 2;
        }
        else
        {
           flag =0;
        }
        printf("run show function on ospid file");
    }
    else if (strcmp(command1, "exit") == 0) 
    {
        printf("run exit/cleanup");
        break;
    } 
    else if (strcmp(command1, "help") == 0) 
    {
        printf("run help function");
        continue;
    } 
    else {
    printf("Nothing entered, run help function");
    continue;
  }
}
}

int readContentsOfProcessMapsFile(int target) {
  FILE *fd; // /proc/<target>/maps
  char name[128], *line = NULL, *match = NULL;
  size_t len = 0;
  char* filename = NULL;

  snprintf(name, sizeof (name), "/proc/%u/maps", target);

  if ((fd = fopen(name, "r")) == NULL) {
    printf("error");
    return (EXIT_FAILURE);
  }

  while (getline(&line, &len, fd) != -1) 
  {
    unsigned long start, end;
    char read, write, exec, cow;
    int offset, dev_major, dev_minor, inode;

    filename = realloca(filename, len);

    sscanf(line, "%p-%p %c%c%c%c %x %x:%x %u %[^\n]", &start, &end, &read,
            &write, &exec, &cow, &offset, &dev_major, &dev_minor, &inode, filename);
    match = strstr(filename, "/ora_");
    if (match != NULL) 
    {
        printf("##lowAddr:%p, highAddr:%p and filename:%s\n", start, end, name);
    }
  }
  free(filename);
  free(line);
  if (fclose(fd) == -1)) 
  {
    printf("Failed to close %s", fd);
    return (EXIT_FAILURE);
  }
  return (EXIT_SUCCESS);
}

我尝试在while循环之后添加fseek(stdin,0,SEEK_END);fflush(stdin);,但仍然会跳过fgets()。我理解使用fflush(stdin)无论如何都不是好事。

当发生这种情况时getchar()打印正方形或Y,其上方有两个点。所以我认为fgets()被忽略的原因是它正在拾取这些字符吗?任何人都可以提供一种方法来阻止/阻止这种情况吗?

感谢所有评论。我已将其缩小到上述readContentsOfProcessMapsFile函数。如果我对此进行评论,那么fgets将按预期工作。

现在我修复了关于close(fd)的拼写错误,它似乎并没有真正关闭文件!刚发现我自己的错误!已更改为fclose,但看到了同样的问题

1 个答案:

答案 0 :(得分:0)

我正在尝试在简单的while循环中使用fgets。 fgets只是没有被调用。 ...

当你试图解决的问题被分散注意力时,很可能你会把所有的努力花在分心而不是问题上。如图所示,您的代码不仅包含您描述的问题,还包含一系列干扰。

评论为 clean up your distractions 提供了一些建议。以下是我对不分心的看法:

在循环读取标准输入示例中使用 fgets的一个非常简单的示例:

#include <stdio.h>

int main(void)
{
        char temp[BUFSIZ];  //BUFSIZ defined as 512 in stdio on my system.

        while((fgets(temp,5,stdin)) != NULL)
                printf("%s\n",temp);

        return 0;
}

EOF会导致循环退出。 (ctrl-C在Windows上停止)

当你开始使用它时,慢慢开始在它周围包含其他所需的功能,每次添加的功能都不会破坏代码时进行验证。随着您的进步,您可能会偶尔遇到错误,当发生这种情况时,请使用 step-wise, pragmatic approach to determining the problem ,然后继续。