C中如何实现replace函数功能
时间:2010-08-26
来源:互联网
各位大侠,由于数据库中无replace函数,因此要外部用C语言写一个replace函数,然后装载进数据库供其使用。
我在网上找了个,但是编译不通过,望各位大侠帮忙提供一个,或者修改下面这个,谢谢!
void replace2
(VARCHAR_LATIN input_string,
VARCHAR_LATIN search_string,
VARCHAR_LATIN replace_string,
VARCHAR_LATIN result_string,
int *input_string_indicator,
int *search_string_indicator,
int *replace_string_indicator,
int *result_string_indicator,
char sqlstate[6],
SQL_TEXT extname[129],
SQL_TEXT specific_name[129],
SQL_TEXT error_message[257])
{
int source_length;
int search_length;
int replace_length;
unsigned char *source_ptr;
unsigned char *source_limit;
unsigned char *match_limit;
unsigned char *save_source_ptr;
unsigned char *target_ptr;
unsigned char *target_limit;
unsigned char *search_ptr;
unsigned char *search_limit;
if (*input_string_indicator == IS_NULL)
{
*result_string_indicator = IS_NULL;
(void) strcpy(sqlstate, UDF_OK);
error_message[0] = EOS;
return;
}
source_length = strlen((char *) input_string);
if (*replace_string_indicator == IS_NOT_NULL)
replace_length = strlen((char *) replace_string);
else
replace_length = 0;
/* Don't search if it is impossible to get a match. */
if ((source_length == 0) ||
(*search_string_indicator == IS_NULL) ||
((search_length = strlen((char *) search_string)) == 0) ||
(search_length > source_length))
{
if (source_length > MAXIMUM_LENGTH)
{
*result_string_indicator = IS_NULL;
(void) sprintf(sqlstate, UDF_ERR_RESULTLENGTH1);
(void) strcpy((char *) error_message, UDF_MSG_RESULTLENGTH1);
return;
}
(void) strcpy((char *) result_string, (char *) input_string);
*result_string_indicator = IS_NOT_NULL;
(void) strcpy(sqlstate, UDF_OK);
error_message[0] = EOS;
return;
}
source_ptr = input_string;
source_limit = input_string + source_length;
match_limit = (source_limit - search_length) + 1;
target_ptr = result_string;
target_limit = result_string + MAXIMUM_LENGTH;
search_ptr = search_string;
search_limit = search_string + search_length;
while (source_ptr < source_limit)
{
if ((*search_ptr == *source_ptr) && (source_ptr < match_limit))
{
/* Possible match. Check remainder of pattern */
save_source_ptr = source_ptr;
while ((++search_ptr < search_limit) &&
(*search_ptr == *(++source_ptr)));
if (search_ptr == search_limit)
{
/* Pattern match. */
++source_ptr;
if (replace_length > 0)
{
/* Substitute new value. */
*target_ptr = EOS;
if (((target_ptr + replace_length) - 1) >= target_limit)
{
*result_string_indicator = IS_NULL;
(void) sprintf(sqlstate, UDF_ERR_RESULTLENGTH2);
(void) strcpy((char *) error_message,
UDF_MSG_RESULTLENGTH2);
return;
}
strcat((char *) target_ptr, (char *) replace_string);
target_ptr += replace_length;
}
}
else
{
source_ptr = save_source_ptr;
if (target_ptr == target_limit)
{
*result_string_indicator = IS_NULL;
(void) sprintf(sqlstate, UDF_ERR_RESULTLENGTH3);
(void) strcpy((char *) error_message,
UDF_MSG_RESULTLENGTH3);
return;
}
*(target_ptr++) = *(source_ptr++);
}
search_ptr = search_string;
}
else
{
if (target_ptr == target_limit)
{
*result_string_indicator = IS_NULL;
(void) sprintf(sqlstate, UDF_ERR_RESULTLENGTH4);
(void) strcpy((char *) error_message, UDF_MSG_RESULTLENGTH4);
return;
}
*(target_ptr++) = *(source_ptr++);
}
}
*target_ptr = EOS;
*result_string_indicator = IS_NOT_NULL;
(void) strcpy(sqlstate, UDF_OK);
error_message[0] = EOS;
}
谢谢!
我在网上找了个,但是编译不通过,望各位大侠帮忙提供一个,或者修改下面这个,谢谢!
void replace2
(VARCHAR_LATIN input_string,
VARCHAR_LATIN search_string,
VARCHAR_LATIN replace_string,
VARCHAR_LATIN result_string,
int *input_string_indicator,
int *search_string_indicator,
int *replace_string_indicator,
int *result_string_indicator,
char sqlstate[6],
SQL_TEXT extname[129],
SQL_TEXT specific_name[129],
SQL_TEXT error_message[257])
{
int source_length;
int search_length;
int replace_length;
unsigned char *source_ptr;
unsigned char *source_limit;
unsigned char *match_limit;
unsigned char *save_source_ptr;
unsigned char *target_ptr;
unsigned char *target_limit;
unsigned char *search_ptr;
unsigned char *search_limit;
if (*input_string_indicator == IS_NULL)
{
*result_string_indicator = IS_NULL;
(void) strcpy(sqlstate, UDF_OK);
error_message[0] = EOS;
return;
}
source_length = strlen((char *) input_string);
if (*replace_string_indicator == IS_NOT_NULL)
replace_length = strlen((char *) replace_string);
else
replace_length = 0;
/* Don't search if it is impossible to get a match. */
if ((source_length == 0) ||
(*search_string_indicator == IS_NULL) ||
((search_length = strlen((char *) search_string)) == 0) ||
(search_length > source_length))
{
if (source_length > MAXIMUM_LENGTH)
{
*result_string_indicator = IS_NULL;
(void) sprintf(sqlstate, UDF_ERR_RESULTLENGTH1);
(void) strcpy((char *) error_message, UDF_MSG_RESULTLENGTH1);
return;
}
(void) strcpy((char *) result_string, (char *) input_string);
*result_string_indicator = IS_NOT_NULL;
(void) strcpy(sqlstate, UDF_OK);
error_message[0] = EOS;
return;
}
source_ptr = input_string;
source_limit = input_string + source_length;
match_limit = (source_limit - search_length) + 1;
target_ptr = result_string;
target_limit = result_string + MAXIMUM_LENGTH;
search_ptr = search_string;
search_limit = search_string + search_length;
while (source_ptr < source_limit)
{
if ((*search_ptr == *source_ptr) && (source_ptr < match_limit))
{
/* Possible match. Check remainder of pattern */
save_source_ptr = source_ptr;
while ((++search_ptr < search_limit) &&
(*search_ptr == *(++source_ptr)));
if (search_ptr == search_limit)
{
/* Pattern match. */
++source_ptr;
if (replace_length > 0)
{
/* Substitute new value. */
*target_ptr = EOS;
if (((target_ptr + replace_length) - 1) >= target_limit)
{
*result_string_indicator = IS_NULL;
(void) sprintf(sqlstate, UDF_ERR_RESULTLENGTH2);
(void) strcpy((char *) error_message,
UDF_MSG_RESULTLENGTH2);
return;
}
strcat((char *) target_ptr, (char *) replace_string);
target_ptr += replace_length;
}
}
else
{
source_ptr = save_source_ptr;
if (target_ptr == target_limit)
{
*result_string_indicator = IS_NULL;
(void) sprintf(sqlstate, UDF_ERR_RESULTLENGTH3);
(void) strcpy((char *) error_message,
UDF_MSG_RESULTLENGTH3);
return;
}
*(target_ptr++) = *(source_ptr++);
}
search_ptr = search_string;
}
else
{
if (target_ptr == target_limit)
{
*result_string_indicator = IS_NULL;
(void) sprintf(sqlstate, UDF_ERR_RESULTLENGTH4);
(void) strcpy((char *) error_message, UDF_MSG_RESULTLENGTH4);
return;
}
*(target_ptr++) = *(source_ptr++);
}
}
*target_ptr = EOS;
*result_string_indicator = IS_NOT_NULL;
(void) strcpy(sqlstate, UDF_OK);
error_message[0] = EOS;
}
谢谢!
作者: fikong2005 发布时间: 2010-08-26
顶啊,各位大侠。
作者: fikong2005 发布时间: 2010-08-27
strstr()找到源字符串
memmove()把源字符串后面的字符串移动到指定位置
然后用strncpy()把目标字符串写入到中间的空隙上。
memmove()把源字符串后面的字符串移动到指定位置
然后用strncpy()把目标字符串写入到中间的空隙上。
作者: davelv 发布时间: 2010-08-27
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28