Понимание scanf () в C (ошибка сегмента) - PullRequest
0 голосов
/ 01 октября 2010

Я не понимаю, как получить ввод в 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(), следующий за другим? Я намерен, чтобы аргументы были в одной строке.

Спасибо!

UPDATE:

Вот обновленный код. Все та же проблема. Надеюсь, это будет более полный клип:

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;
}

Я хочу, чтобы он мог прочитать файл, подобный этому:

вставить бобы Лима

удалить бобы

и т.д.. и из стандартного ввода. Некоторые команды имеют два аргумента, некоторые имеют один, а некоторые нет.

Еще раз спасибо

Ответы [ 2 ]

1 голос
/ 01 октября 2010

fgets читает всю строку (до новой строки) из файла в переменной FILE* input, и помещает эту строку в buffer.

scanf читает последовательность непробел из стандартного ввода и запись его в command, который, по-видимому, совпадает с указателем buffer.

Что-то здесь почти наверняка не соответствует вашим ожиданиям.Может быть, вы имели в виду

sscanf(command, "%s", other_buffer);
1 голос
/ 01 октября 2010

Я подозреваю, что ваша переменная buffer не выделена.Вы заявляете как таковой?

char* buffer;

Если это так, вот почему вы неисправны.

Вам необходимо выделить память для буфера.

char buffer[1024];

...