我在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"。
答案 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