用scanf读一个短语

时间:2013-06-13 15:00:40

标签: c scanf

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

dict.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)

3 个答案:

答案 0 :(得分:0)

那不是:

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

因为它只读取%s,直到第一个空格才是一切,但是

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

答案 1 :(得分: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,a-z和文字 空格(&#34;&#34;)字符。大写单词和其他类型的空白会 傻瓜!

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

答案 2 :(得分:0)

问题是scanf格式化。

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