C - Почему sscanf (буфер, «% * s% d% s% s% c», & key, succ_ip, succ_gate и & eol) == 4? - PullRequest
0 голосов
/ 18 марта 2020

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

1 Ответ

1 голос
/ 18 марта 2020

Как сказал @NateEldredge: «sizeof (buffer) возвращает размер буфера переменной, который, будучи char *, вероятно, составляет 4 или 8 байт.»

Что явно вызывало проблему, потому что, когда я писал ввод, как: sentry 2 127.0.0.1 59001 буфер не будет сохранять всю информацию. поэтому, конечно, функция sscanf () не может получить все переменные. их там не было.

ps: этого fflu sh () быть не должно. Извини ...

...