C:使用缓冲器从终端扫描输入

时间:2012-10-27 16:31:19

标签: c string sockets

我正在尝试用C编写客户端/服务器程序来完成家庭作业。应该发生的是: 建立连接 服务器等待客户端发送消息 客户端要求用户输入消息,将其分配给字符串,然后将其发送到服务器。这是在客户端上的以下代码中完成的:

while(1){
/* prepare message */
    printf ("Please enter the message: ");
    bzero (buffer, BUFFERLENGTH); //BUFFERLENGTH is defined as 256
    fgets (buffer, BUFFERLENGTH, stdin);
/* send message */
    n = write (sockfd, buffer, strlen(buffer));
    if (n < 0) 
         error ("ERROR writing to socket");
    bzero (buffer, BUFFERLENGTH);
}

现在,我的问题是这段代码发送了一些乱码。据我所知,缓冲区没有被清空,或者并不总是BUFFERLENGTH长,所以从堆栈中读取随机垃圾?

服务器接收消息然后打印它。如果客户端程序在"actual string I input"中扫描,那么服务器将输出类似于:

的内容

actual string I input @&^%~&虽然终端输出更多的是非打印字符,但也有换行符。 服务器的代码是:

n = read (*newsockfd, buffer, BUFFERLENGTH -1);
printf("buffer = %s\n",buffer);
if (n < 0) 
    error ("ERROR reading from socket");

当我删除while循环时,这不会发生!

我读过关于bzero的内容,我知道它已被弃用,我应该使用memset;但是我试着这样做:memset(buffer,0,BUFFERLENGTH);并且问题仍然存在。

为什么缓冲区附加了乱码的任何解释?


修改

缓冲区在客户端中声明:char buffer[BUFFERLENGTH]; `

1 个答案:

答案 0 :(得分:1)

printf("%s", ...)期望一个0-terninated字符串。

因此,您应该将0附加到收到的缓冲区的末尾。

<强>更新

假设缓冲区定义如下:

char buffer[BUFFERLENGTH];

要向最后一个数组条目添加0,请执行以下操作:

buffer[BUFFERLENGTH - 1] = 0;

一种更通用的方法(尽管成本更高)是在读入之前将整个接收缓冲区归零:

memset(buffer, 0, BUFFERLENGTH);
n = read (*newsockfd, buffer, BUFFERLENGTH - 1);
if (n < 0) 
  error ("ERROR reading from socket");
else
  printf("buffer = %s\n", buffer);