我正在开发一个程序,我必须通过套接字一次发送一个char。连接工作正常并且字符正在发送但是当我必须将它们打印到stdout时,我无法在没有换行符的情况下打印它们。
for ( ; ; ) {
nb = select(connfd+1, &read_set, NULL, NULL, NULL);
if (nb<=0) {
printf("Error\n");
}else{
if (FD_ISSET(connfd, &read_set)) {
char buff[2];
nb = read(connfd, buff, 4096);
if (nb < 0){
printf("The client disconected\n");
break;
}
printf("%s\n",buff); // this prints them with a new line between each char.Removing the \n will make it work only by hitting enter
//fputs(buff,stdout); //does the same as printf without \n
}
再提一点:客户端发送字符而不等待stdin的ENTER。
任何提示? 感谢
答案 0 :(得分:4)
1)不要欺骗read
- 它往往几乎总会导致坏事:
char buff[2];
nb = read(connfd, buff, 4096);
这应该是: char buff [2]; nb = read(connfd,buff,1);
2)你需要终止字符串:
buff[1] = 0;
2a)printf("%s", buff)
实际上不会显示任何内容,因为没有新行强制将缓冲的数据实际写入屏幕 - 使用fflush(stdout);
来强制它。
3)在标准C ++(或C)中无法读取字符而无需等待“输入”。我建议你看一下ncurses
函数包吗?
答案 1 :(得分:2)
printf("%s\n",buff);
对于C风格的字符串,%s
格式说明符仅 。由于buff
不是C风格的字符串,这是错误的。也:
char buff[2];
nb = read(connfd, buff, 4096);
如何将最多4096个字符读入一个仅足够2的缓冲区?你可能想要:
char buff[4096];
nb = read(connfd, buff, 4096);
if (nb < 0){
printf("The client disconected\n");
break;
}
for (int i = 0; i < nb; ++i)
putchar(buff[i]);
fflush(stdout);
答案 2 :(得分:1)
您需要刷新缓冲区。在printf
来电之后,也请致电fflush(stdout)
。
此外,由于您尝试一次打印1个字符,因此还有其他一些问题:
char buff; // you wanted to read 1 character at a time
nb = read(connfd, &buff, 1);
if (nb < 1)
{
printf("The client disconected\n");
break;
}
printf("%c", buff);
fflush(stdout);