2013-12-06 3 views
0

У меня есть * строка ввода из консоли. Эта строка может выглядеть следующим образом: название шоу года ххх .. и мне нужен выход, чтобы выглядеть следующим образом: имя: Adi Год выпуска: 1994 (к примеру) ..Создание массива жетонов и сравнение его с другой строкой

Я пытался добиться этого с помощью strtok(), но мне также нужно сравнить каждый токкон с разрешенными ключевыми словами (имя, год ...), если это слово не разрешено, чем нужно пропустить токен (удалить) .. например, в этом случае он пропустит show и xxx.

Другая проблема заключается в том, что мне нужно эти маркеры в виде массива, чтобы работать с ними и с .. структурами Там не должно быть никаких ограничений на количество слов, которые могут быть введены в качестве вклада ..

Надеюсь, вы поняли, что я спросил .. так, как сделать токены из строки с помощью strtok или что-то еще и сделать их массивами или указателями и как сравнить эти токены с другой строкой (например, константа: #define NAME «name»), а также некоторые другие входы, чтобы пропустить их (удалить).

Я был бы очень признателен, если бы вы могли помочь мне в этом .. Спасибо ..

+2

Добро пожаловать в Переполнение стека. Мы будем очень признательны, если вы покажете нам какой-нибудь код. –

ответ

0

Я бы избегал массива. Он предоставляет ненужные накладные расходы. То, о чем вы просите, может быть достигнуто с помощью чего-то вроде этого:

void parseString(char * string) { 
    char * name = NULL; 
    char * year = NULL: 
    char * ptr = strtok(string, " "); 
    while (ptr != NULL) { 
     if (stricmp(ptr, "name") == 0) { 
      ptr = strtok(ptr, " "); 
      name = ptr; 
      /* do whatever with name */ 
     } else if (stricmp(ptr, "year") == 0) { 
      ptr = strtok(ptr, " "); 
      /* do whatever with year */ 
      year = ptr; 
     } /* else if ... */ 

     ptr = strtok(ptr, " "); 
    } 

Это дает вам достаточную гибкость. Вы проверяете все условия, которые вам нужны, вам не нужно беспокоиться о том, как распределить массив, и при необходимости вы можете получить доступ к значениям параметров.

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdbool.h> 

char *tolowerstr(char *str){ 
    char *p = str; 
    while((*p++ = tolower(*p))); 
    return str; 
} 

int cmp(const void *a, const void *b){ 
    return strcmp(*(const char **)a, *(const char **)b); 
} 

bool isBanWord(const char *word){ 
    static const char *table[] = 
     { "fuck", "show", "xxx" };//sorted 
    char **ret, *key; 
    key = tolowerstr(strdup(word)); 
    ret=bsearch(&key, table, sizeof(table)/sizeof(*table), sizeof(*table), cmp); 
    free(key); 

    return !!ret;//ret != NULL ? true : false; 
} 

//Create and return as a dynamic array of pointer to the copy of the word from a string. 
//String passed is destroyed. 
char **strToWords(char *str, size_t *size){ 
    const char *delimiters = " ."; 
    size_t count=0; 
    char **array = malloc(strlen(str)*sizeof(char*));//number of words < string length 
    if(array){ 
     char *token=strtok(str, delimiters); 
     for(; token ;token=strtok(NULL, delimiters)){ 
      if(!isBanWord(token))//skip ban word 
       array[count++] = strdup(token); 
     } 
     array[count] = NULL;//End mark 
     array=realloc(array, (count + 1)*sizeof(*array));//include NULL 
    } 
    *size = count; 
    return array; 
} 

typedef struct words { 
    char **words; 
    size_t n; //number of words 
} Words; 

void clearWords(Words *w){ 
    size_t i; 
    for(i=0;i < w->n;++i) 
     free(w->words[i]); 
    free(w->words); 
    w->words = NULL; 
    w->n = 0; 
} 

void printWords(Words *w){ 
    size_t i=0; 
    while(i < w->n){ 
     printf("%s", w->words[i++]); 
     if(w->words[i]) 
      putchar(' '); 
    } 
    putchar('\n'); 
} 

int main(){//DEMO 
    char sentence[] = "show name year xxx.";//input string. Will be destroyed. 
    Words w; 

    w.words = strToWords(sentence, &w.n); 

    printWords(&w);//name year 

    clearWords(&w); 

    return 0; 
} 
Смежные вопросы