理解C中的scanf()(Seg Fault)

时间:2010-09-30 20:49:17

标签: 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;
}

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

 scanf("%s", command);

 if (!strncmp(command, "in", 2)) {
  command_name = INSERT;
  while(arg_counter){
   printf("whileloop reached, arg_counter is %d", arg_counter);
   scanf("%s", valid_args_str[arg_counter - 1]);
  }
.
.
.
}

在出现分段错误之前,甚至没有评估print语句。这是怎么回事?

while (fgets(buffer, MAX_LEN + 1, input) != 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;
}

我想要发生的是它能够读取这样的文件:

插入豆子lima

删除豆子

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

再次感谢

2 个答案:

答案 0 :(得分:1)

我怀疑您的buffer变量未分配。你是这样声明的吗?

char* buffer;

如果是这样,那就是你出现错误的原因。

您需要为缓冲区分配内存。

char buffer[1024];

答案 1 :(得分:1)

fgets正在从变量FILE* input中的文件中读取整行(直到换行符),并将该行放在buffer中。

scanf正在从标准输入中读取一系列非空格,并将其写入command,它与buffer的指针相同。

这里的东西几乎肯定不是你想要的。也许你的意思是

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