2015-01-01 4 views
1

Я напишу функцию для поиска имени таблицы в строке запроса sql.Как получить дополнительную строку из другой строки в (C)

мой код

char* SQLParser_GetTable(char *query) 
{ 
char *str = ""; 
char *FROM="FROM";  

if(strstr(query, FROM)) 
{ 
    char *e; 
    int index;  
    e = strchr(query, 'F'); 
    index = (int)(e - FROM); 

    str=substring(str,index+4,5); 
} 

return str; 
} 

main.c

 query = "SELECT * FROM TABLE1"; 
    char *tbl=SQLParser_GetTable(query); 

но этот код Retun полная строка не имя таблицы.

МОЙ код должен возвращать «ТАБЛИЦА 1».

+1

Что вы ожидаете следующие две строки, чтобы сделать:. 'Е = strchr (запрос, «F «); index = (int) (e - FROM); '? – NPE

ответ

1

Я не знаю, что substring() есть, но этот код делает то, что вы думаете, ваша ли

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

char *SQLParser_GetTable(char *query) 
{ 
    char *str; 
    char *FROM = "FROM "; 

    /* point to the start of FORM */ 
    if ((str = strstr(query, FROM)) == NULL) 
     return NULL; 
    /* If there is only one space between FROM and TABLE1 point to it */ 
    str = strchr(str, ' '); 
    if (str == NULL) 
     return NULL; 
    /* move past the ' ' character */ 
    str += 1; 
    /* return a copy of the string */ 
    return strdup(str); 
} 

int main() 
{ 
    char *table = SQLParser_GetTable("SELECT * FROM TABLE1"); 
    if (table != NULL) 
    { 
     printf("%s\n", table); 
     free(table); 
    } 
    return 0; 
} 

заметить, что это не является надежным вообще, так как там может быть любое количество пробелов между FROM и именем таблицы ,

+0

ХОРОШЕЕ СПАСИБО. –

+0

Как получить столбцы и где условие .ex: выберите col1, col2 из таблицы1, где col1 = 1? и сохранить в массиве или связанном списке? могу ли я связаться со мной tehhitech [at] live .com. У меня сейчас много проектов. –

+0

Я бы не рекомендовал этого, вы должны использовать генератор синтаксического анализатора. см. [bison] (http://www.gnu.org/software/bison/) и [flex] (http://flex.sourceforge.net/), иначе вы должны использовать конечный автомат и написать токенизатор, так как sql предложения могут иметь любое количество пробелов и есть много других ситуаций для обработки. Вам нужно написать лексер и указать грамматику, которая может быть выполнена с помощью программ в ссылках, а не в этом порядке. И, конечно, [email protected] –

0

Я написал следующую длинную функцию, но по сравнению с функциями в других ответах она является более или менее правильной. :). Эта функция не учитывает регистр букв :)

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

char * SQLParser_GetTable(const char *query) 
{ 
    const char FROM[] = "FROM";  
    char *p; 
    int found; 

    found = (p = strstr(query, FROM)) != NULL; 
    found = found && (p == query || isblank((unsigned char)p[-1])); 
    found = found && (*(p += sizeof(FROM) - 1) == '\0' || 
         isblank((unsigned char)p[0])); 

    if (found) 
    { 
     const char *q = p; 
     size_t n = 0; 

     while (isblank((unsigned char)*q)) ++q; 
     while (q[n] && !isblank((unsigned char)q[n])) ++n; 

     p = malloc((n + 1) * sizeof(char)); 

     memcpy(p, q, n); 
     p[n] = '\0'; 
    } 
    else 
    { 
     p = NULL; 
    } 

    return p; 
} 

int main(void) 
{ 
    char *query = "SELECT * FROM TABLE1"; 
    char *p = SQLParser_GetTable(query); 

    if (p) puts(p); 

    free(p); 

    return 0; 
} 

Выход

TABLE1 
+0

Это хороший подход, хотя ваш код не очень читабельен, и вместо этого вы должны использовать 'isspace', потому что в' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' также игнорируются. +1. –

+0

@iharob Только теперь я обнаружил, что код содержит дефект. Например, оператор SQL может содержать более одного символа «FROM», а первое, которое будет найдено, не обязательно правильно «FROM». :) Таким образом, поиск должен быть продолжен до тех пор, пока не будет никакого «FROM». –

+0

И есть еще много проблем, поэтому я рекомендовал генератор синтаксического анализатора. –