Итак, я пишу программу, и здесь есть фрагмент кода, в котором я должен взять пользовательский ввод в 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;
}