【发布时间】:2020-06-29 02:51:57
【问题描述】:
所以我正在编写一个程序,并且有一段代码我必须在标准输入中获取用户输入并选择要做什么。我已经获取了与它对应的代码,并制作了另一个程序(如下所示)来检查错误是否继续存在。它确实如此。错误是在执行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;
}
【问题讨论】:
-
顺便说一句,
memset(buffer,0,sizeof(buffer));显然是错误的;sizeof不检测动态分配区域的大小。sizeof(buffer)返回变量buffer的大小,char *可能是 4 或 8 个字节。 -
同样,
fgets(buffer, sizeof(buffer), stdin)也在读取 4 或 8 个字节。我敢打赌这与你的问题有关。 -
fflush(stdin)??fflush函数用于输出流 -
Don't cast the result of malloc in C。而
sizeof(char)永远是1,不需要和它相乘 -
问题是@NateEldredge 所说的。谢谢你。 " sizeof(buffer) 返回变量缓冲区的大小,它是一个 char * 可能是 4 或 8 个字节 "