2013-03-02 5 views
1

Я пытаюсь использовать getline() для ввода ввода с клавиатуры, сохранения его в строке, tokenize, а затем распечатать маркеры. Когда я запускаю это, я получаю ошибку сегментации на последней итерации (итерация, которая обрабатывает последний токен с входа).Tokenizing input from getline

#define _POSIX_C_SOURCE 200809L 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

//////////////////////// 
// Main Method  // 
//////////////////////// 
void main() { 
    system("clear"); 
    int ShInUse = 1; // Represents if shell is in use 

    char curpath[1024]; // holds current path to print with prompt 
    char *UserCommand = NULL; 
    size_t combytes = 100; 
    UserCommand = (char *) malloc(combytes); 
    char *tok; 

    // Main loop that shell uses // 
    while (ShInUse == 1) { 
     getcwd(curpath, sizeof(curpath)); // Store initial working dir 
     printf("gash:%s>", curpath); // print prompt 

     getline(&UserCommand, &combytes, stdin); 
     tok = strtok(UserCommand, " \n"); // Tokenize input 
     if (tok == NULL) { 
      printf("Enter a command.\n"); 
     } else { 
      // Exit command // 
      if (strcmp(tok, "exit") == 0) { 
       ShInUse = 0; 
      } else { 
       while (tok != NULL) { 
        printf("You entered a command.\n"); 
        printf("tok: %s\n", tok); 
        tok = strtok(NULL, " \n"); 
       } 
      } 
     } 
    } 
    free(UserCommand); 
} 

Любые идеи относительно того, что может быть причиной этого? В настоящее время отладка не вариант для меня.

+0

Возможно, вы забыли инициализировать UserCommand до NULL? – wildplasser

+0

Комментировать код по строке, чтобы увидеть, где именно происходит segfault. –

+0

@wildplasser Спасибо за ваш ответ. Я пробовал это, но это все еще не сработало. Я забыл включить мои стирания строк, я добавлю их на свой пост. – Greg

ответ

3

Я тестировал код с этим:

#define _POSIX_C_SOURCE 200809L 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char *UserCommand = NULL; 
    size_t combytes = 100; 
    UserCommand = (char *) malloc(combytes); 
    char *tok; 
    while(getline(&UserCommand, &combytes, stdin) != EOF) 
    { 
    tok = strtok(UserCommand, " \n"); // Tokenize input 
    if (tok != NULL) { 
     while(tok != NULL) { 
     printf("%s\n", tok); 
     tok = strtok(NULL, " \n"); 
     } 
    } 
    } 
    return 0; 
} 

и она отлично работает для всех испытаний я сделал - в том числе передавая исходный файл в качестве входных данных, писать довольно длинные строки, и т.д., и т.д.

Итак, я пришел к выводу, что у вас, вероятно, есть что-то ELSE, которое segfaults в вашем коде.

+0

+1 После чтения документа на 'getline()' этот код кажется более чем разумным (хотя 'if (tok! = NULL)' не требуется). Я думаю, ты прав. Проблема, скорее всего, в другом месте. – WhozCraig

+0

Hi Mat! ..Почните 'getline (& UserCommand, & combytes, stdin)' в цикле While. Я понимаю, что OP нужно 'getline()' один раз. Где мне не хватает **? ** –

+0

Да, я взял существующий код «как есть», просто чтобы избежать «удаления/добавления» того, что повлияло на его поведение, хотя я заметил, что 'if' как« не нужно », , –

0

Также не ответ, просто еще один вариант для программирования стиле:

Всякий раз, когда у меня есть цикл tokenizing, как у вас, я предпочитаю, чтобы построить их, как это:

for(tok = strtok(UserCommand, " \n"); 
    tok != NULL; 
    tok = strtok(NULL, " \n")) 
{ 
    printf("%s\n", tok); 
} 

Это держит обе strtok() звонки близко вместе и требует записи теста NULL только один раз. Твой путь в порядке, это еще один вариант. Удачи!