1

我试图创建一个程序来解释从客户端发送到服务器的命令。我的问题是我只能阅读命令的第一个单词。

字典.h

typedef struct
{
  pid_t pid_cliente;
  int status;
  char command[TAM_MAX];
  char secure[TAM_MAX];
  char password[TAM_MAX];
  int client_type;
} request;

客户端

  printf("[ADMIN]: ");
  scanf("%s[^\n]", buffer); //reads command
  printf("Sending -> '%s'\n", buffer);
  strcpy(request.command, buffer, MAX_SIZE-1)   //MAX_SIZE = 50
  write(server_fifo, & request, sizeof(request));

服务器端

read_res = read(server_fifo, & request, sizeof(request));
if (read_res < sizeof(request))
        {
          if (!strncasecmp("exit",(char *) & request,4)) return;
          else
            {
              fprintf(stderr, "\nMessage Error!");
              return;
            }
        }  
token = strtok(request.command, " "); //reads command
printf("Command -> '%s'\n", token)

..
interprets wich command to do
..

token = strtok(NULL, " "); //reads command argument
printf("Argument -> '%s'\n", token);

输入:

addcity lisbon

输出:

Sending -> addcity
Sending -> lisbon

Command -> addcity
Argument -> (NULL)
4

3 回答 3

0

您的 scanf 格式规范与您的输入不匹配。这个简单的原型可以广泛地满足您的需求:

#include <stdio.h>
int main(int argc, char **argv)
{
    char buf[64] = {0};
    printf("> ");
    scanf("%[0-9a-z ]", buf);
    printf(">> %s\n", buf);
    return 0;
}

请注意,scanf 格式规范将读取 0-9、az 和文字空格 (" ") 字符。大写的单词和其他类型的空格会欺骗它!

对于更灵活的输入处理,您可能需要尝试将 read(2) 读入缓冲区并执行您自己的标记化。像 flex/bison 这样的东西值得研究——尽管它可能有点矫枉过正。根据应用程序的许可限制,GNU 的 readline 库可能也值得一看。

于 2013-06-13T15:34:22.607 回答
0

那不是:

scanf("%s[^\n]", buffer);

因为它只读取%s到第一个空格之前的所有内容,但是

scanf("%[^\n]", buffer);
于 2013-06-13T15:28:48.590 回答
0

问题是 scanf 格式。

scanf(” %[^\n]s”, buffer);
于 2013-06-13T15:56:02.473 回答