最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言去除相鄰重復(fù)字符函數(shù)的實(shí)現(xiàn)方法

 更新時(shí)間:2017年08月11日 10:11:53   投稿:lqh  
這篇文章主要介紹了C語(yǔ)言去除相鄰重復(fù)字符函數(shù)的實(shí)現(xiàn)方法的相關(guān)資料,實(shí)現(xiàn)去重字符串相鄰重復(fù)的字符,不相鄰的不用去重的功能,需要的朋友可以參考下

C語(yǔ)言去除相鄰重復(fù)字符函數(shù)的實(shí)現(xiàn)方法

字符去重函數(shù)

功能:去重字符串相鄰重復(fù)的字符,不相鄰的不用去重

參數(shù):

arg1 -- 輸入字符串
arg2 -- 字符串開(kāi)始位置
arg3 -- 字符串結(jié)束位置

要求:

輸入?yún)?shù)為arg1時(shí), 對(duì)這個(gè)字符串去重
輸入?yún)?shù)為arg1,arg2時(shí), 從arg2位置到字符串結(jié)束,去重
輸入?yún)?shù)為arg1,arg2,arg3時(shí),從arg2到arg3位置,去重

src/include/catalog/pg_proc.h

DATA(insert OID = 6669 ( remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ remove_dup_char_arg1 _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");
DATA(insert OID = 6670 ( remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ remove_dup_char_arg2 _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");
DATA(insert OID = 6671 ( remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 23 23" _null_ _null_ _null_ _null_ _null_ remove_dup_char_arg3 _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");

 src/backend/utils/adt/myfuncs.c

/* 
 * Remove duplicate characters 
 * author:young
 */
Datum 
remove_dup_char_arg1 (PG_FUNCTION_ARGS)
{
 int n = 0;
 text *arg0 = PG_GETARG_TEXT_P(0);

 char *str = text_to_cstring(arg0);
 n = strlen(str);

 remove_dup(str, 0, n);

 PG_RETURN_TEXT_P(cstring_to_text(str));
}

Datum 
remove_dup_char_arg2 (PG_FUNCTION_ARGS)
{
 int n = 0;
 text *arg0 = PG_GETARG_TEXT_P(0);
 int32 arg1 = PG_GETARG_INT32(1);

 char *str = text_to_cstring(arg0);
 n = strlen(str);

 if (!(1 <= arg1 && arg1 <= n))
 {
 ereport(ERROR,
  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
  errmsg("out of range")));
 }

 remove_dup(str, arg1 - 1, n);

 PG_RETURN_TEXT_P(cstring_to_text(str));
}

Datum 
remove_dup_char_arg3 (PG_FUNCTION_ARGS)
{
 int n = 0;
 text *arg0 = PG_GETARG_TEXT_P(0);
 int32 arg1 = PG_GETARG_INT32(1);
 int32 arg2 = PG_GETARG_INT32(2);

 char *str = text_to_cstring(arg0);
 n = strlen(str);

 if (!(1 <= arg1 && arg1 <= arg2 && arg2 <= n))
 {
 ereport(ERROR,
  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
  errmsg("out of range")));
 }

 remove_dup(str, arg1 - 1, arg2 - 1);

 PG_RETURN_TEXT_P(cstring_to_text(str));
}

void 
remove_dup(char *str, int start, int end)
{
 int i = start, k = start;

 for (i = start; i <= end; i++) 
 {
 if (str[i + 1] && str[i + 1] == str[i] && i + 1 <= end)
 {
  k++;
 } 
 else 
 {
  str[i-k] = str[i];
 }   
 }
 str[i-k] = '\0';
}

比較繁瑣,再做一下修改,三個(gè)函數(shù)放到一個(gè)中

src/include/catalog/pg_proc.h

DATA(insert OID = 6669 ( remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ remove_dup_char _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");
DATA(insert OID = 6670 ( remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ remove_dup_char _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");
DATA(insert OID = 6671 ( remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 23 23" _null_ _null_ _null_ _null_ _null_ remove_dup_char _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");

src/backend/utils/adt/myfuncs.c

添加定義:

#define PG_GETARG_IF_EXISTS(n, type, defval) \
 ((PG_NARGS() > (n) && !PG_ARGISNULL(n)) ? PG_GETARG_##type(n) : (defval)) 

 修改方法:

/* 
 * Remove duplicate characters 
 * author:yangjie
 */
Datum 
remove_dup_char (PG_FUNCTION_ARGS)
{
 text *arg0 = PG_GETARG_IF_EXISTS(0, TEXT_P, NULL);
 int32 arg1 = PG_GETARG_IF_EXISTS(1, INT32, 0);
 int32 arg2 = PG_GETARG_IF_EXISTS(2, INT32, 0);
 int n = 0;

 char *str = text_to_cstring(arg0);
 n = strlen(str);

 if(PG_NARGS() == 1)
 {
 remove_dup(str, 0, n);
 }

 if(PG_NARGS() == 2)
 {
 if (!(1 <= arg1 && arg1 <= n))
 {
  ereport(ERROR,
  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
  errmsg("out of range")));
 }
 remove_dup(str, arg1 - 1, n);
 }

 if(PG_NARGS() == 3)
 {
 if (!(1 <= arg1 && arg1 <= arg2 && arg2 <= n))
 {
  ereport(ERROR,
  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
  errmsg("out of range")));
 }
 remove_dup(str, arg1 - 1, arg2 - 1);
 }

 PG_RETURN_TEXT_P(cstring_to_text(str));
}

 再修改一下,如果有輸入?yún)?shù)就用 沒(méi)有就用默認(rèn)值  最后再去重處理減少代碼重用

/* 
 * Remove duplicate characters 
 * author:yangjie
 */
Datum 
remove_dup_char (PG_FUNCTION_ARGS)
{
 text *arg0 = PG_GETARG_IF_EXISTS(0, TEXT_P, NULL);
 int n = 0;
 char *str = text_to_cstring(arg0);
 n = strlen(str);
 int32 arg1 = PG_GETARG_IF_EXISTS(1, INT32, 0);
 int32 arg2 = PG_GETARG_IF_EXISTS(2, INT32, n);
 
 if (!(1 <= arg1 && arg1 <= n))
 {
 ereport(ERROR,
  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
  errmsg("1 <= arg1 && arg1 <= n")));
 }

 if (!(1 <= arg1 && arg1 <= arg2 && arg2 <= n))
 {
 ereport(ERROR,
  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
  errmsg("1 <= arg1 && arg1 <= arg2 && arg2 <= n")));
 }

 remove_dup(str, arg1, arg2);
 
 PG_RETURN_TEXT_P(cstring_to_text(str));
}

void 
remove_dup(char *str, int start, int end)
{
 int i = start -1, k = start - 1;

 for (i = start - 1; i <= end - 1; i++) 
 {
 if (str[i + 1] && str[i + 1] == str[i] && i + 1 <= end - 1)
 {
  k++;
 } 
 else 
 {
  str[i-k] = str[i];
 }   
 }
 str[i-k] = '\0';
}
 

以上就是C語(yǔ)言去除相鄰重復(fù)字符函數(shù)的實(shí)現(xiàn)方法,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C++ Explicit關(guān)鍵字詳細(xì)解析

    C++ Explicit關(guān)鍵字詳細(xì)解析

    以下是對(duì)C++中Explicit關(guān)鍵字的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-09-09
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單五子棋游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語(yǔ)言二分查找算法及實(shí)現(xiàn)代碼

    C語(yǔ)言二分查找算法及實(shí)現(xiàn)代碼

    本文主要介紹C語(yǔ)言的二分查找算法,這里給大家詳細(xì)介紹了什么是二分查找,并提供代碼實(shí)例,需要的小伙伴可以參考下
    2016-07-07
  • C語(yǔ)言實(shí)現(xiàn)靜態(tài)版通訊錄的代碼分享

    C語(yǔ)言實(shí)現(xiàn)靜態(tài)版通訊錄的代碼分享

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的靜態(tài)版通訊錄,主要運(yùn)用了結(jié)構(gòu)體,一維數(shù)組,函數(shù),分支與循環(huán)語(yǔ)句等等知識(shí),需要的可以參考一下
    2023-01-01
  • VC6.0實(shí)現(xiàn)讀取Excel數(shù)據(jù)的方法

    VC6.0實(shí)現(xiàn)讀取Excel數(shù)據(jù)的方法

    這篇文章主要介紹了VC6.0實(shí)現(xiàn)讀取Excel數(shù)據(jù)的方法,非常實(shí)用的功能,需要的朋友可以參考下
    2014-07-07
  • C語(yǔ)言中的逗號(hào)運(yùn)算符詳解

    C語(yǔ)言中的逗號(hào)運(yùn)算符詳解

    在C語(yǔ)言中逗號(hào)“,”也是一種運(yùn)算符,稱為逗號(hào)運(yùn)算符,其功能是把兩個(gè)表達(dá)式連接起來(lái)組成一個(gè)表達(dá)式,?稱為逗號(hào)表達(dá)式,這篇文章主要介紹了C語(yǔ)言中的逗號(hào)運(yùn)算符,需要的朋友可以參考下
    2022-11-11
  • OpenCV視頻流C++多線程處理方法詳細(xì)分析

    OpenCV視頻流C++多線程處理方法詳細(xì)分析

    為OpenCV是搞計(jì)算機(jī)視覺(jué)必須要掌握的基礎(chǔ),這篇文章主要給大家介紹了關(guān)于OpenCV視頻流多線程處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng)

    C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 數(shù)據(jù)結(jié)構(gòu)之伸展樹(shù)詳解

    數(shù)據(jù)結(jié)構(gòu)之伸展樹(shù)詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之伸展樹(shù)詳解,本文對(duì)伸展樹(shù)(Splay Tree)的單旋轉(zhuǎn)操作、一字型旋轉(zhuǎn)、之字形旋轉(zhuǎn)區(qū)間操作等理論知識(shí)做了講解,并給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-08-08
  • C++關(guān)于構(gòu)造函數(shù)可向父類或者本類傳參的講解

    C++關(guān)于構(gòu)造函數(shù)可向父類或者本類傳參的講解

    今天小編就為大家分享一篇關(guān)于C++關(guān)于構(gòu)造函數(shù)可向父類或者本類傳參的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12

最新評(píng)論

平顶山市| 米泉市| 九龙坡区| 东安县| 临西县| 西和县| 南部县| 绥滨县| 资源县| 柏乡县| 辽中县| 逊克县| 三台县| 克拉玛依市| 建始县| 武安市| 桦川县| 武城县| 太湖县| 上高县| 大新县| 金门县| 张家界市| 绩溪县| 昌乐县| 金坛市| 芮城县| 门源| 探索| 四会市| 铜陵市| 香港 | 高陵县| 剑川县| 饶阳县| 织金县| 桐柏县| 手游| 昌邑市| 高平市| 湖北省|