如何从(C)中的另一个字符串中获取子字符串

时间:2015-01-01 12:32:19

标签: c

我在sql查询字符串中编写查找表名的函数。

我的代码

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);

但此代码重新输入完​​整字符串而不是表名。

我的代码必须返回" TABLE1"。

2 个答案:

答案 0 :(得分: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和表名之间可以有任意数量的空格。

答案 1 :(得分: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