2013-02-19 1 views
1

Что я пытаюсь сделать, это разбить пользовательский ввод по частям с пробелом в качестве разделителя, скопировать части в массив (tokenAr) и сравнить tokenAr[0] (первая часть), если это равным sHistory. если они равны, проверьте значение tokenAr[1], если это «1», «2» и т. д., чтобы выполнить соответствующую команду, введенную в массив history. Это то, к чему я пытался дойти, и он падает. Я использую TCC для Windows x64. EDIT: Я забыл упомянуть, что начал учиться C всего два дня назад.Передача токенов из массива в strcmp

EDIT2: Я запустить программу в отладчике, и он поднял в линии в Acces Violation(Segmentation Fault)if(strcmp(tokenArPtr[0],sHistory)==0)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    int i=1; int j=1; int k=0; 
    char history[100][100] = {0}; 
    char sKey[] = "exit"; 
    char sInput[100]; 
    char sHistory[]="history"; 

    do 
    { 
     //gather user input 
     printf ("hshell> "); 
     fgets (sInput, 100, stdin); 
     strcpy(history[i],sInput); 
     i++; 
     //END_gather user input 

     //Tokenizing 

     char delims[] = " "; 
     char *tokenArPtr[5]; 
     char *result = NULL; 

     result = strtok(sInput, delims); 
     tokenArPtr[0] = result; 

     while (result!=NULL) 
     { 
       puts(result); 
       result= strtok(NULL, delims); 
       tokenArPtr[k+1] = result; 

       puts(tokenArPtr[k]); 
       puts("====="); 
       k++; 
     } 
     k=0; 
     /* 
     //END_Tokenizing 

     if(strcmp(tokenArPtr[0],sHistory)==0) 
     { 
      for(j=1;j<i;j++) 
      { 
       printf("%d. %s \n",j,history[j]); 
      } 
     } 

     else if (strcmp (sKey,tokenArPtr[0]) != 0) 
     { 
      printf("\nCommand not found \n"); 
     }*/ 
    }while (strcmp (sKey,sInput) != 0); 
    return 0; 
} 

EDIT 3: Я использовал result переменную вместо tokenArPtr непосредственно, но при отладке, я заметил, что значения массива не обновляются.

+0

Вы пытались запустить его в отладчике? –

+0

@JoachimPileborg No. @hmjd должен ли я установить 'k = 0' после выхода из цикла while? (непосредственно перед комментарием end_tokenizing) – serge

ответ

0

Какой тип возвращает strtok? char *. Каков тип tokenAr [k]? char. Какой тип strcmp ожидает в качестве входных данных? char * и char *. Каков тип tokenAr [0]? char.

См. Проблему? Вам следует. * довольно значителен.

Предполагается, что tokenAr объявлен как char *tokenAr[2];, сколько char * значений может хранить tokenAr? Что происходит, когда k превышает 2? Вам нужно убедиться, что вы не переполняете массив tokenAr.

history неинициализирован. Использование неинициализированной переменной - это неопределенное поведение. Я предлагаю его инициализировать следующим образом: char history[100][100] = { 0 };

В какой книге вы читаете?

+0

Отредактируйте код в соответствии с вашим предложением. Допустим, он никогда не превысит двух, для простоты. Все еще сбой. Я читаю Head First C. – serge

+0

'k ++', за которым следует тест 'tokenArPtr [k]! = NULL' - неопределенное поведение, поскольку tokenArPtr [k] не инициализируется. Я бы ожидал, что сбой.Рассмотрим: 'for (k = 0; k Sebivor

+0

Я отредактирую код с моими последними изменениями, которые не сбой, но, как вы увидите, я не могу обновить значения массива. Обновленный код. – serge

0

Хотя токенизация цикла никогда не закончится, потому что тест находится на переменной «результат», которая никогда не изменится ... Итак, вы, наконец, переходите к переполнению буфера с помощью «tokenAr» ... Измените свой код на test "tokenAr".

Edit: И tokenAR должен быть массив ... (я не знаю, как она может составить ...)

+0

сделал это, но все тот же. – serge

0

Есть много проблем ... Прежде всего, вы должны включать string.h, которые покажет вам некоторые ошибки в компиляции.

Я считаю, что главная проблема здесь:

char tokenAr[2]; 
     result = strtok(sInput, delims); 
     while (result!=NULL) 
     { 
       tokenAr[k] = strtok(NULL, delims); 
       k++; 
     } 

tokenAr должен быть массив указателей, а не символов. И вы уверены, что k никогда не превысит 2? Утверждение поможет отладить.

+0

редактировал код. Пожалуйста, проверьте это. – serge

+0

Вы не удалили ошибку ... Вы все еще проверяете постоянное значение ... Вы должны проверить последний написанный указатель – cedrou

+0

while (tokenAr [0]! = NULL) ??? условие должно зависеть от k –