欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題

 更新時間:2017年10月31日 09:48:20   作者:llcomeon1_  
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解這部分內(nèi)容,需要的朋友可以參考下

C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題

 主要實現(xiàn)了三種字符串的模式匹配,主要包括字符串子操作的集合,字符串指針回溯,和KMP算法 

頭文件 

#ifndef INDEXHEAD_H_INCLUDED
#define INDEXHEAD_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 255
typedef char Sstring[MAXLEN + 1] ;
int StrAssign( Sstring str , char* ps ) ;
int StrLength( Sstring str ) ;
int StrPrint( Sstring str ) ;
int StrCompare( Sstring str1 , Sstring str2 ) ;
int StrSub( Sstring sub , Sstring str , int pos , int length ) ;
int StrIndex1( Sstring str , Sstring sub , int pos ) ;
int StrIndex2( Sstring str , Sstring sub , int pos ) ;
int StrIndex3( Sstring str , Sstring sub , int pos ) ;
int GetNext( Sstring str , int next[] ) ;
#endif // INDEXHEAD_H_INCLUDED
 

函數(shù)實現(xiàn)

#include "indexhead.h"
int StrAssign( Sstring str , char* ps )
{
  int i = 0 ;
  if( strlen( ps ) > MAXLEN )
  {
    printf( "ERROR!\n" ) ;
    exit( 1 ) ;
  }
  str[i++] = strlen( ps ) ;
  while( i <= strlen( ps ) )
  {
    str[i] = *( ps + i - 1 ) ;
    i++ ;
  }
  return 0 ;
}
int StrPrint( Sstring str )
{
  int i = 1 ;
  while( i <= str[0] )
  {
    printf( "%c" , str[i++] ) ;
  }
  printf( "\n" ) ;
  return 0 ;
}
int StrLength( Sstring str )
{
  return str[0] ;
}
int StrCompare( Sstring str1 , Sstring str2 )
{
  int i = 1 ;
  int ret = 0 ;
  while( i <= str1[0] && i <= str2[0] )
  {
    ret = ( unsigned char )str1[i] - ( unsigned char )str2[i] ;
    if( ret < 0 )
    {
      return -1 ;
    }
    else if( ret > 0 )
    {
      return 1 ;
    }
    else
    {
      i++ ;
    }
  }
  if( i <= str1[0] )
  {
    return -1 ;
  }
  else if( i <= str2[0] )
  {
    return 1 ;
  }
  else
  {
    return 0 ;
  }
}
int StrSub( Sstring sub , Sstring str , int pos , int length )
{
  if( pos < 1 || pos > str[0] || length < 0 || length > str[0] - pos + 1 )
  {
    printf( "ERROR!\n" ) ;
    exit( 1 ) ;
  }
  int i = 1 ;
  sub[0] = length ;
  while( i <= length )
  {
    sub[i] = str[pos + i - 1] ;
    i++ ;
  }
  return 0 ;
}
int StrIndex1( Sstring str , Sstring sub , int pos )
{
  pos = 1 ;
  Sstring stemp ;
  while( pos <= str[0] - sub[0] + 1 )
  {
    StrSub( stemp , str , pos , sub[0] ) ;
    if( !StrCompare( stemp , sub ) )
    {
      return pos ;
    }
    pos++ ;
  }
  return 0 ;
}
int StrIndex2( Sstring str , Sstring sub , int pos )
{
  if( pos < 1 || pos > str[0] - sub[0] + 1 )
  {
    printf( "ERROR!\n" ) ;
    exit( 1 ) ;
  }
  int i = pos ;
  int j = 1 ;
  while( ( i <= str[0] - sub[0] + 1 ) && ( j <= sub[0] ) )
  {
    if( str[i] == sub[j] )
    {
      i++ ;
      j++ ;
    }
    else
    {
      i = i - j + 2 ;
      j = 1 ;
    }
  }
  if( j > sub[0] )
  {
    return i - sub[0] ;
  }
  return 0 ;
}
int GetNext( Sstring str , int next[] )
{
  int i = 1 ;
  next[1] = 0 ;
  int j = 0 ;
  while( i < str[0] )
  {
    if( j== 0 || str[i] == str[j] )
    {
      ++i ;
      ++j ;
      next[i] = j ;
    }
    else
    {
      j = next[j] ;
    }
  }
  return 0 ;
}
int StrIndex3( Sstring str , Sstring sub , int pos )
{
  int i = pos ;
  int j = 1 ;
  int next[ sub[0] ] ;
  GetNext( sub , next ) ;
  while( i <= str[0] && j <= sub[0] )
  {
    if( j == 0 || str[i] == sub[j] )
    {
      ++i ;
      ++j ;
    }
    else
    {
      j = next[j] ;
    }
  }
  if( j > sub[0] )
  {
    return i - sub[0] ;
  }
  return 0 ;
}

 測試匹配函數(shù)

#include "indexhead.h"
int main()
{
  /*Sstring str ;
  Sstring str1 ;
  char* p = "hello" ;
  StrAssign( str , p ) ;
  StrAssign( str1 , "ahello" ) ;
  StrPrint( str ) ;
  int i = StrLength( str ) ;
  printf( "%d\n" , i ) ;
  int j = StrCompare( str , str1 ) ;
  printf( "%d\n" , j ) ;
  StrSub( str , str1 , 3 , 4 ) ;
  StrPrint( str ) ;*/
  /*Sstring str1 ;//驗證StrIndex1()
  Sstring sub ;
  StrAssign( str1 , "shfiodshfdghafhs" ) ;
  StrAssign( sub , "dgh" ) ;
  int i = StrIndex1( str1 , sub , 1 ) ;
  printf( "%d\n" , i ) ;*/
  /*Sstring str1 ;//驗證StrIndex2()
  Sstring sub ;
  StrAssign( str1 , "shfiodshfdghafhs" ) ;
  StrAssign( sub , "dgh" ) ;
  int i = StrIndex2( str1 , sub , 1 ) ;
  printf( "%d\n" , i ) ;*/
  Sstring str1 ;//驗證StrIndex3()
  Sstring sub ;
  StrAssign( str1 , "shfiodshfdghafhs" ) ;
  StrAssign( sub , "dgh" ) ;
  int i = StrIndex3( str1 , sub , 1 ) ;
  printf( "%d\n" , i ) ;
  return 0;
}

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • C語言中初始、增加和刪除進程信號的操作方法簡介

    C語言中初始、增加和刪除進程信號的操作方法簡介

    這篇文章主要介紹了C語言中初始、增加和刪除進程信號的操作方法簡介,分別是sigemptyset函數(shù)、sigaddset函數(shù)和sigdelset函數(shù)的用法,需要的朋友可以參考下
    2015-09-09
  • Qt利用QDrag實現(xiàn)拖拽拼圖功能詳解

    Qt利用QDrag實現(xiàn)拖拽拼圖功能詳解

    QDrag類為MIME-based拖拽數(shù)據(jù)轉(zhuǎn)換提供支持。本文為大家主要介紹如何利用QDrag類實現(xiàn)拖拽拼圖功能。左邊是打散的圖,拖動到右邊進行復現(xiàn),此外程序還支持手動拖入原圖片,感興趣的可以了解一下
    2022-07-07
  • c/c++語言位域注意事項分析

    c/c++語言位域注意事項分析

    所謂“位域”是把一個字節(jié)中的二進位劃分為幾個不同的區(qū)域, 并說明每個區(qū)域的位數(shù)。每個域有一個域名,答應在程序中按域名進行操作
    2013-09-09
  • C語言用函數(shù)實現(xiàn)反彈球消磚塊

    C語言用函數(shù)實現(xiàn)反彈球消磚塊

    這篇文章主要為大家詳細介紹了C語言用函數(shù)實現(xiàn)反彈球消磚塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • c語言 數(shù)據(jù)結(jié)構(gòu)實現(xiàn)之字符串

    c語言 數(shù)據(jù)結(jié)構(gòu)實現(xiàn)之字符串

    這篇文章主要介紹了c語言 數(shù)據(jù)結(jié)構(gòu)實現(xiàn)之字符串的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++版本簡易Flappy bird

    C++版本簡易Flappy bird

    這篇文章主要介紹了C++版本簡易Flappy bird的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • C++中的Reactor原理與實現(xiàn)

    C++中的Reactor原理與實現(xiàn)

    reactor設(shè)計模式是event-driven?architecture的一種實現(xiàn)方式,處理多個客戶端并發(fā)的向服務端請求服務的場景,每種服務在服務端可能由多個方法組成,這篇文章主要介紹了Reactor原理與實現(xiàn),需要的朋友可以參考下
    2022-07-07
  • 基于C語言實現(xiàn)關(guān)機小游戲的示例代碼

    基于C語言實現(xiàn)關(guān)機小游戲的示例代碼

    關(guān)機會寫吧!猜數(shù)字會寫吧!本文將結(jié)合這兩個功能,用C語言編寫一個關(guān)機惡搞小游戲(最好的朋友轉(zhuǎn)瞬即逝),只要猜對了,1分鐘后執(zhí)行關(guān)機,除非輸入“我是豬”,但是輸完后,1分鐘后還是會執(zhí)行關(guān)機,該保存保存,感興趣的可以嘗試一下
    2022-07-07
  • C語言強制類型轉(zhuǎn)換規(guī)則實例詳解

    C語言強制類型轉(zhuǎn)換規(guī)則實例詳解

    強制類型轉(zhuǎn)換是把變量從一種類型轉(zhuǎn)換為另一種數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于C語言強制類型轉(zhuǎn)換的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • C++ OpenCV實現(xiàn)白平衡之灰度世界算法

    C++ OpenCV實現(xiàn)白平衡之灰度世界算法

    灰度世界算法是白平衡各種算法中最基本的一種。本文將利用C++和OpenCV實現(xiàn)白平衡中的灰度世界算法,文中示例代碼講解詳細,感興趣的可以了解一下
    2022-05-05

最新評論