我试图创建一个程序来解释从客户端发送到服务器的命令。我的问题是我只能阅读命令的第一个字。
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)
答案 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);