我正在尝试使用以下程序从文件描述符"0"(STDIN)读取用户输入。以前,它没有问题,但是在程序的其他部分进行了一些更改后,它在读取输入时给了我一个分段错误。我还删除了"FD_CLR(0,&readfds)"以查看它是否有效,但事实并非如此。你能检查一下问题出在哪里吗?
char *userInput;
FD_ZERO(&masterfds);
FD_SET(0, &masterfds);
FD_SET(udp_con, &masterfds);
maxfds = udp_con;
while(exit == false)
{
readfds = masterfds;
selectFunc = select(maxfds+1, &readfds, NULL, NULL, &tv);
if(selectFunc < 0)
{
message("error in select");
exit = true;
}
else if(selectFunc == 0) //If there is a timeout
{
}
else //If a file descriptor is activated
{
if(FD_ISSET(udp_con, &readfds)) //If there is an activity on udp_con
{
/*read the udp_con via recvfrom function */
}
if(FD_ISSET(0, &readfds)) //If There is an input from keyboard
{
/* When it reaches to this part, the program shows a "segmentation fault" error */
fgets(userInput, sizeof(userInput), stdin);
int len = strlen(userInput) - 1;
if (userInput[len] == 'n')
{
userInput[len] = ' ';
}
string str = userInput;
cout<<"The user said: "<<str<<endl;
commandDetector(str);
FD_CLR(0, &readfds);
}
}
}
您正在声明userInput
为char *
。 这为您提供了一个指向某个随机位置的指针,您几乎可以肯定不拥有也无法写入该位置。 如果这曾经奏效,那纯粹是运气(坏)的。
解决此问题的最简单方法是将userInput
声明为数组,如下所示:
char userInput[1024];
.
这将使userInput成为一个1024个字符的数组,您可以根据需要对其进行修改,特别是可以传递到fgets
中以供其写入。
另一种方法是使用 malloc
来获取一些内存:
char *userinput = malloc(1024);
如果这样做,您还必须将调用更改为fgets
sizeof(userInput)
因为这将产生指针的大小(通常为 4 或 8),而不是它指向的内存大小。 所以像这样:
fgets(userInput, 1024, stdin);
此外,如果您从malloc
获取内存,则应在完成内存后调用free
,因此:
free(userInput);