字串的學習(1)

2021-08-15 05:26:03 字數 3926 閱讀 3447

c語言裡並沒有字串這種資料型別,而是利用字元陣列加以特殊處理(末尾加'\0')來表示乙個字串,事實上資料結構裡的串就是乙個儲存了字元的鍊錶,並且封裝實現了各種字串的常用操作。

主要闡述 bf演算法和kmp演算法

串的常用操作

strcpy (s1, s2)

複製字串,將s2的內容複製到s1,函式原型strcpy (char*, const char*),可以看出第二引數可以是常量也可以是變數,但第一引數必須是變數。這裡要注意的是s2的內容長度(包括'\0')不能超出s1的總長度。該函式通常可以用來為字元陣列賦值,示例(第3行可以認為是在給cpy賦值):

char str[233];  

char cpy[233];

strcpy(cpy, "i am string");

strcpy(str, cpy);

strncpy(p, p1, n) 

複製指定長度字串,與上乙個函式類似,只不過多了第三個引數,指的是要拷貝的字串的長度,此函式會將p1首位址開始的n個位元組的內容拷貝到p中,需要注意的是,拷貝後的內容並不包含字串結束標誌'\0',所以需要手動新增才可使p變成需要的字串,示例:

char str[233];  

char cpy[233] = "i am string";

strncpy(str, cpy, 8);

str[8] = '\0';

//避免陣列越界

strncpy(s1,s2,sizeof(s1)-1);

s1[sizeof(s1)-1]='\0';

strcat(p, p1) 

字串連線,該函式會將p1的內容新增到p的末尾,比如p="hello",p1="world",則執行該函式,p的內容變為"helloworld"。原型_crtimp char* __cdecl __mingw_nothrow strcat (char*, const char*);同樣第二引數可為常量,這裡需要注意的是,p和p1必須都是合法字串(即包含結束標誌'\0')且需要保證連線後的總長度不會超過p的總大小。示例:

char str[233] = "hello";  

char cat[233] = "world";

strcat(str, cat);

strncat(p, p1, n) 

附加指定長度字串,類似上面strcpy和strncpy的區別,這裡也是一樣的,擷取p1前n個位元組的內容新增到p的末尾,注意,此函式會覆蓋p末尾的'\0',並在新增p1完成後自動在最後新增'\0',所以無需像上面那樣手動加'\0'。示例:

char str[233] = "hello";  

char cat[233] = "world***";

strncat(str, cat, 5);

strlen(p) 

取字串長度,這是我們最常用的乙個函式了,得到字串長度,沒什麼好說的,需要注意的是p必須為合法字串,即有'\0',下文中若再次提到「合法字串」即為「包含「'\0'」的字串 。還有一點是,該函式返回值為字串的字元數,要區別於字串占用空間,比如對於字串"love",它的長度為4,而占用空間為5,strlen對於此字串的返回值即為4,示例:

char str[233] = "hello";  

int len = strlen(str);

strcmp(p, p1) 

比較字串,即比較p與p1的字典序大小,如果p比p1小(p字典序靠前),則返回小於0的數;若p比p1大(p

字典序靠後),則返回大於0的數;若兩字串一樣,則返回0。所謂的字典序,指的是將字串首部對齊,從左到右依次比較對應位置的字元大小,直至找到第乙個不一樣的位置,其大小關係就是整個字串的大小關係(如果大寫與小寫比較,則實際是比較其ascii碼),當然,如果比較到乙個字串結束還未有結果,則短的字串靠前(想一下英文詞典裡單詞的排序)。

例如"a"<"b","food"<"foot","hack">"back","hasak">"hasa","bbc">"abcd","ask"<"ask"等……

該函式通常用於判斷兩字串是否相等,兩引數均可為常量,示例(該例子res值為-1):

char str[233] = "hello";  

char cmp[233] = "world";

int res = strcmp(str, cmp);

strcasecmp(p, p1)

strcasecmp(p, p1)

忽略大小寫比較字串,與上乙個函式是同樣的功能,只不是上面是區別大小寫的,這裡是忽略大小寫,也就是說,此函式認為'a'和'a'是相等的,也就是說字串"abcdefghij"和"abcdefghij"是相等的,返回值為0,示例(此例res為0)

char str[233] = "hello";  

char cmp[233] = "hello";

int res = strcasecmp(str, cmp);

strchr(p, c) 

在字串中查詢指定字元, 即在p中從左向右查詢第一次出現字元c的位置(找不到就返回null),引數c可為字元或表示ascii碼的整型。需要注意的是該函式的返回值並非下標整數值,而是乙個代表該位置的位址,所以我們需要減去p的首位址即可得到該字元第一次出現的下標值。示例(下例res值為4):

char str[233] = "hello world";  

char ch = 'o';

int res = strchr(str, ch) - str;

strrchr(p, c) 

在字串中反向查詢指定字元, 與上乙個函式功能一致,只不過這個是從右向左查詢第一次出現的位置(返回值也是該位置的位址,找不到則null),同樣需要減去首位址來獲取索引下標值,示例(該res值為7):

char str[233] = "hello world";  

char ch = 'o';

int res = strrchr(str, ch) - str;

strstr(p, p1) 

查詢字串, 上述兩個函式均是在字串裡查詢字元,這個函式是從字串查詢字串,也就是查詢字串的子串(找不到就返回null),在p中從左向右查詢第一次匹配了p1的位置,比如p為"abcdabcd",p1為"bcd",則執行函式,返回值為第一次匹配的地方即藍色的bcd中的b,同樣是返回位址,需要減去首位址得到下標,示例(此res為2):

char str[233] = "hello hello";  

int res = strstr(str, "llo") - str;

即bp演算法:

樸素的模式匹配演算法

子串的定位操作通常稱做模式匹配,

其中子串稱做模式串,主串稱做目標串,

樸素的模式匹配演算法即是模式匹配的一種演算法,

其優點是簡單易懂,易於理解,某些應用場合效率較高。

缺點是需要多次回溯,

//對於資料較大的文字檔案而言效率極低。

int index(char *a,char *b)

int main()

kmp演算法:

處理字串匹配的較高效演算法,明天好好研究一下。

redis 字串命令學習1

如果key存在並且是字串,就將value追加到key原來的末尾 若是key不存在相當於set操作 2.decr key 將key中儲存的數字值減一,若key不存在先初始化為0,在執行 decr 操作,如key值不能表示為數字報錯.3 decrby key decrment 將key中儲存的數字減去d...

JavaScript學習 字串1

出自 var num 19 19 var mystr num.tostring 19 var mystr string num 19 var mystr num 19 parseint 1234blue returns 1234 parseint 0xa returns 10 parseint 22...

字串1 字串的旋轉

題目描述 給定乙個字串,要求將字串前面的若干個字元移到字串的尾部。例如 將字串 abcdef 的前三個字元 a b c 移到字串的尾部,那麼原字串將變成 defabc 首先想到的是將需要移動的字元乙個乙個移到字串的尾部。實現如下 public class transfet s n 1 t publi...