理解C中的scanf()(Seg故障)

理解C中的scanf()(Seg故障),c,input,segmentation-fault,scanf,C,Input,Segmentation Fault,Scanf,我不理解C语言的输入。我有以下代码,它产生了分段错误: int main(int argc, char *argv[]){ while (fgets(buffer, MAX_LEN + 1, input) != NULL) { get_command(t, buffer); } return 0; } 及 在出现分段错误之前,print语句甚至没有被评估。发生什么事了 while(fgets(缓冲区,最大长度+1,输入)!=NULL)在做什么? scanf()在做什么?我可以让一个sc

我不理解C语言的输入。我有以下代码,它产生了分段错误:

int main(int argc, char *argv[]){
 while (fgets(buffer, MAX_LEN + 1, input) != NULL) {
  get_command(t, buffer);
 }
return 0;
}

在出现分段错误之前,print语句甚至没有被评估。发生什么事了

while(fgets(缓冲区,最大长度+1,输入)!=NULL)在做什么?
scanf()
在做什么?我可以让一个
scanf(
)后面跟着另一个吗?我希望这些论点是一致的

谢谢

更新:

这里是更新的代码。还是一样的问题。希望这将是一个更完整的剪辑:

typedef enum { INSERT = 1, SEARCH, DELETE, RESET, DISPLAY} COMMAND;

static void get_command(Table *t, char *command) {
    COMMAND command_name = 0;
    char valid_args_str[] = {"aa","bb"};
    int arg_counter = 0;
    char other_buffer[MAX_LEN + 1];

    sscanf(command, "%s", other_buffer);

 if (!strncmp(other_buffer, "in", 2)) {
  command_name = INSERT;
  while(++arg_counter){
   printf("whileloop reached, arg_counter - 1 is %d\n", arg_counter - 1);
   scanf("%s", valid_args_str[arg_counter - 1]);
  }
 } else if (!strncmp(other_buffer, "se", 2)) {
.
.
.
execute_comm(t, command_name, valid_args_str);
}

static void execute_comm(Table *t, COMMAND command, char *args[]){
 switch(command){
 case INSERT:
  insert(t, args[0], args[1]);
  break;
.
.
}
以下是我的主要观点:

int main(int argc, char *argv[]){

 FILE *input;
 char buffer[MAX_LEN + 1];
 input = stdin;
 if(argc > 2){
  fprintf(stderr, "%s", "Too many arguments");
  perror("Too many arguments");
  exit(EX_OSERR);
 } else if (argc == 2){
  if ((input = fopen(argv[1], "r")) == NULL) {
   fprintf(stderr, "%s", "error opening files");
   perror("error opening file");
   exit(EXIT_FAILURE);
  }
 }

 while (fgets(buffer, MAX_LEN + 1, input) != NULL) {
  get_command(t, buffer);
 }
 fclose(input);
 return 0;
}
我希望它能够读取这样的文件:

利马

删除bean

等,并从标准输入。有些命令有两个参数,有些有一个,有些没有


再次感谢

我怀疑您的
缓冲区
变量没有分配。你是这样申报的吗

char*缓冲区

如果是这样的话,这就是为什么你是seg断层

您需要为缓冲区分配内存


char缓冲区[1024]
fgets
正在从变量
file*input
中的文件中读取整行(直到换行符),并将该行放入
缓冲区中

scanf
正在从标准输入读取一个非空白序列,并将其写入
命令
,该命令似乎与
缓冲区
的指针相同

这里有些东西几乎肯定不是你想要的。也许你是说

sscanf(command, "%s", other_buffer);

缓冲区是如何声明的您不知道没有对
printf
语句求值。它在
stdin
上打印,这是一个缓冲输出文件。没有任何类型的刷新,甚至没有可以触发刷新的
\n
。因此,它的输出很可能被写入缓冲区,并且在程序崩溃时丢失。使用
fprintf(标准,“然而,…
相反,as
stderr
没有被缓冲,并立即打印到任何输出中。而且,这是您遇到问题的实际代码吗?我看不到任何地方声明了
buffer
,或者
MAX_LEN
。现在,如果您实际粘贴了
命令的定义
。。。
sscanf(command, "%s", other_buffer);