我试图在一个简单的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/