C:使用缓冲区扫描来自终端的输入

标签 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]; `

最佳答案

printf("%s", ...) 需要一个以 0 结尾的字符串。

因此,您应该在收到的缓冲区末尾附加一个 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);

关于C:使用缓冲区扫描来自终端的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13101992/

相关文章:

c - C 中意外的函数原型(prototype)行为

java - SQL BLOB 不以空值结尾。我该怎么做?

c++ - 循环套接字连接尝试最终会断开互联网连接

c - 在 c 中使用带有命令行参数的 if 语句

c - 关于 creat() 系统调用模式参数的快速问题

string - 在VBA中搜索字符串中包含小数的数字

java - 如何将创建的套接字传递给另一个 Java 进程

带有私有(private) channel 的 Laravel Echo SocketIO

c - 禁用中断会保护非 volatile 变量还是会发生重新排序?

java - 为什么 getName() 返回 null?