Как анализировать строки с символом новой строки в C?

Я пишу оболочку и использую getline() со стандартным вводом с клавиатуры для приема команд. Однако у меня возникают проблемы с токенизацией входных данных. Я пытался использовать \n в качестве разделителя в функции strtok(), но, похоже, он не работает.

Например, я включил оператор if, чтобы проверить, набрал ли пользователь «выход», и в этом случае он завершит программу. Это не прекращается.

Вот код, который я использую:

void main() {
int ShInUse = 1;
char *UserCommand;   // This holds the input
int combytes = 100;
UserCommand = (char *) malloc (combytes);
char *tok;

while (ShInUse == 1) {
   printf("GASh: ");   // print prompt
   getline(&UserCommand, &combytes, stdin);
   tok = strtok(UserCommand, "\n");
   printf("%s\n", tok);

   if(tok == "exit") {
      ShInUse = 0;
      printf("Exiting.\n");
      exit(0);
   }
}

person Greg    schedule 27.02.2013    source источник
comment
Вы пытались использовать отладчик, чтобы увидеть, что читается? Если нет, вы должны.   -  person    schedule 27.02.2013


Ответы (2)


if (tok == "exit")

tok и exit являются указателями, поэтому вы сравниваете два указателя. Это приводит к неопределенному поведению, поскольку они не принадлежат одному и тому же агрегату.

Это не способ сравнения строк. Используйте скорее strcmp.

 if (strcmp (tok, "exit") == 0)
person md5    schedule 27.02.2013

Как заявил @Kirilenko, вы не можете сравнивать строки с помощью оператора ==.

Но это не так. Если вы используете getline() вам все равно не нужно разбивать ввод на строки, так как getline() читает только одну строку. И если вы действительно хотите разделить ввод на другие разделители, вам придется вызывать strtok() в цикле, пока он не вернет NULL.

person Avidan Borisov    schedule 27.02.2013