C-为什么sscanf(buffer,“%* s%d%s%s%s%c”,&key,succ_ip,succ_gate,&eol)== 4?

问题描述 投票:0回答:1

因此,我正在编写一个程序,并且有一些代码需要在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;
}
c string input stdin
1个回答
1
投票

像@NateEldredge所说的:“ sizeof(buffer)返回变量缓冲区的大小,它为char *可能是4或8个字节。”

这显然是引起问题的原因,因为当我编写如下输入时:sentry 2 127.0.0.1 59001缓冲区不会保存所有信息。因此,当然,sscanf()函数无法获取所有变量。他们不在那里。

ps:那个fflush()不应该在那里。对不起...

© www.soinside.com 2019 - 2024. All rights reserved.