scanf()的函数并不保持在屏幕用户输入数据
我已经使用scanf()
保持屏幕,并采取由用户输入在一个多线程客户端套接字程序。 scanf()
在此处未屏幕,用户无法输入数据。 线程函数的代码是:scanf()的函数并不保持在屏幕用户输入数据
void *send_data(void *num)
{
int *sock_s=(int *) num;
int sock=*sock_s;
char msg[50];
printf("Enter data:");
while(1) {
scanf("%s",msg);
if(strcmp(msg,"exit")==0)
{
break;
}
send(sock_s,msg,sizeof(msg),0);
}
send(sock,msg,sizeof(msg),0);
}
和代码中创建线程t这是:
status_s=pthread_create(&thread_s,NULL,send_data,(void *)&sock);
if(status_s==0)
printf("sending");
缓冲可能在它是“\ R”或“\ n”。我们需要刷新输入缓冲区以将其删除。
使用fflush(标准输入)函数以冲洗缓冲液。
fflush(stdin)
scanf("%s", msg);
编辑:您是否尝试过使用fgets而不是scanf?
fgets(msg);
不,fflush(stdin)根据C标准给出未定义的行为。 – 2013-04-04 12:19:35
仍然无法正常工作.... – user3032010 2013-04-04 12:21:07
@kanika我更新了我的文章。 – m1o2 2013-04-04 12:29:06
- 您在标准输入离开尾随换行符。这个问题就是这样一个常见问题,每天至少要有5个计时器。搜索本网站上的scanf ...解决方案:
scanf(" %s", msg);
或类似。 - 不能使用纯
scanf
和类似的库函数从一个线程里面,他们不是线程安全的。 - 您使用它的方式,
scanf
是脆弱的,并会得到缓冲区溢出。
他使用scanf(“%s”),是不是?所以这似乎不是通常的fgets-reads-an-old-newline问题。 – 2013-04-04 12:38:31
@ ThomasPadron-McCarthy请注意格式字符串中的空格。 '%s'alone不能修复尾随行提要。 – Lundin 2013-04-04 12:45:16
'%s'转换跳过了最初的空格。只有'%c','%['和'%n'转换不会。 – 2013-04-04 13:19:55
试试这个,看看它是否有效
printf("Enter data:");
scanf("\n%s",msg);
while(strcmp(msg,"exit")!=0)
{
send(sock_s,msg,sizeof(msg),0);
scanf("\n%s",msg);
}
我想可能有一些问题与while循环
什么味精scanf函数返回后,包含哪些内容? – stdcall 2013-04-04 12:32:58
请在发布到本网站之前尽一切努力来修复杂乱的凹痕。 – Lundin 2013-04-04 12:32:59
你是什么意思,“拿着屏幕”?我可以看到你想与用户交互,为什么不用read()来代替。 'n = read(STDIN_FILENO,&msg [0],49); msg [n] ='\ 0';'这可能无法解决您的问题,但您将不再使用这些功能。 – yeyo 2013-04-04 12:36:12