我试图在一个简单的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,但看到同样的问题

最佳答案

我试图在一个简单的while循环中使用fgets。 fgets只是不被调用。

当您要解决的问题周围充满干扰时,您很可能会全神贯注于干扰而不是问题上。如图所示,您的代码不仅包含您描述的问题,而且还包含许多干扰。

注释为clean up your distractions提供了一些建议。以下是我的专心致志:

一个工作的fget的非常简单的示例在循环中读取stdin示例:

#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,然后继续。

关于c - fget被跳过/不停止输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48420442/

10-13 23:12