因此,我正在编写一个程序,并且有一些代码需要在stdin中接受用户输入并选择要执行的操作。我已经采用了与之相对应的一些代码,并制作了另一个程序(波纹管),以检查错误是否仍然存在。确实如此。错误是在执行if(sscanf(buffer, "%*s %d %s %s%c", &key, succ_ip, succ_gate, &eol) == 4 && eol == '\n')
,第二个sscanf()时发生的,并且我已经计算出sscanf()为!= 4,因为我要的是4个变量,所以这是我期望的值。
奇怪的是,当strcmp(token, "new") == 0
时它可以正常工作,但是当strcmp(token, "sentry") == 0
时它不能工作...
[如果有人能帮助我,我会非常感激。
这是我遇到问题的代码的一部分
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 150
int main(){
int key;
char* succ_ip;
succ_ip = (char*)malloc((Max+1)*sizeof(char));
char* succ_gate;
succ_gate = (char*)malloc((Max+1)*sizeof(char));
char* s_succ_ip;
s_succ_ip = (char*)malloc((Max+1)*sizeof(char));
char* s_succ_gate;
s_succ_gate = (char*)malloc((Max+1)*sizeof(char));
char* buffer;
buffer = (char*)malloc((5*Max+1)*sizeof(char));
char* token;
token = (char*)malloc((Max+1)*sizeof(char));
char eol = 0;
int block = 0;
int exit_flag = 0;
while(fgets(buffer, sizeof(buffer), stdin)){
sscanf(buffer, "%s", token);
/*NEW: creating the first server*/
if(strcmp(token, "new") == 0 && block == 0){
if(sscanf(buffer, "%*s %d%c", &key, &eol) == 2 && eol == '\n'){
/*strcpy(succ_ip, argv[1]);
strcpy(succ_gate, argv[2]);
strcpy(s_succ_ip, argv[1]);
strcpy(s_succ_gate, argv[2]);*/
block = 1;
printf("Chave : %d\n", key);
printf("-> Ring created.\n");
}
else{
printf("-> The command \\new is of type \"new i\". Where i is a key.\n");
fflush(stdin);
memset(buffer,0,sizeof(buffer));
memset(token,0,sizeof(token));
}
}
/*ENTRY: ... */
else if(strcmp(token, "entry") == 0 && block == 0){
/* do stuff */
block = 1;
printf("-> Server entered.\n");
}
/*SENTRY: adding a server specifying it's successor */
else if(strcmp(token, "sentry") == 0 && block == 0){
if(sscanf(buffer, "%*s %d %s %s%c", &key, succ_ip, succ_gate, &eol) == 4 && eol == '\n'){
/*test for unique case when there are only 2 servers*/
/*otherwise do the normal procedure*/
/*tcp_client = init_tcp_cl(succ_ip, succ_gate);
tcp_client = request_tcp_cl(tcp_client, "SUCCCONF\n");
close_tcp_cl(tcp_client);*/
printf("Chave : %d\n", key);
printf("Next server ip: %s\n", succ_ip);
printf("Next server ip: %s\n", succ_gate);
block = 1;
printf("-> Server sentered.\n");
}
else{
printf("-> The command \\sentry is of type \"sentry i succ.ip succ.gate\". Where i is a key.\n");
fflush(stdin);
memset(buffer,0,sizeof(buffer));
memset(token,0,sizeof(token));
}
}
/*LEAVE: ... */
else if(strcmp(buffer, "leave\n") == 0 && block == 1){
/* do stuff */
block = 0;
printf("-> Left the ring.\n");
}
/* FALTA ADICIONAR O ESTADO DO SERVIDOR!!! */
else if(strcmp(buffer, "show\n") == 0 && block == 1){
/*printf("-> Key: %d\n-> IP: %s\n-> PORT: %s\n-> SuccIP: %s\n"
"-> SuccPORT: %s\n", key, argv[1], argv[2],
succ_ip, succ_gate);*/
}
/*FIND: ... */
else if(strcmp(token, "find") == 0){
/* do stuff */
}
/*EXIT: exits the application successfully*/
else if(strcmp(buffer, "exit\n") == 0){
printf("\nExiting the application...\n");
exit_flag = 1;
}
/*Invalid command, ignores it*/
else{
printf("-> Invalid command.\n");
}
}
return 1;
}
像@NateEldredge所说的:“ sizeof(buffer)返回变量缓冲区的大小,它为char *可能是4或8个字节。”
这显然是引起问题的原因,因为当我编写如下输入时:sentry 2 127.0.0.1 59001
缓冲区不会保存所有信息。因此,当然,sscanf()函数无法获取所有变量。他们不在那里。
ps:那个fflush()不应该在那里。对不起...