c,c++中字符串處理函數strtok,strstr,strchr,strsub

http://blog.csdn.net/wangqing_12345/article/details/51760220

1,字符串切割函數?

函數原型:char *strtok(char *s, char *delim);

函數功能:把字符串s按照字符串delim進行分割,然后返回分割的結果。

函數使用說:

1.strtok函數的實質上的處理是,strtok在s中查找包含在delim中的字符并用NULL(’/0′)來替換,直到找遍整個字符串。這句話有兩層含義:(1)每次調用strtok函數只能獲得一個分割單位。(2)要獲得所有的分割單元必須反復調用strtok函數。

2.strtok函數以后的調用時的需用NULL來替換s.

3.形參s(要分割的字符串)對應的變量應用char s[]=”….”形式,而不能用char *s=”….”形式。

例子如下:

#include <stdio.h>?

#include <string.h>

int?main(void)

{

????? char buf[]=”Golden Global View”;

??????char* token = strtok( buf, " ");

????? while( token != NULL )

????? {

?????????? printf( ”%s “, token );

?????????? token = strtok( NULL, ” “);

????? }

????? return 0;

}

其結果為:

Golden

Global

View

?

但是如果我們把char buf[]=”Golden Global View”;換成char *buf=”Golden Global View”; 則會出錯,原因是如果分配的大小一樣的前提下char *p和char b[]也是有區別的,
char *p="abc";
char b[]="abc";
當這兩個語句編譯后,編譯器會將“abc”放在常量區中,而strtok(char *s, char *delim)函數是在s中查找包含在delim中的字符并用NULL(’/0′)來替換,直到找遍整個字符串。這句話就能體現指針和數組的區別:既然查找就要p++/b++。 要替換成(‘/0’),那么就要對*p/*b賦值
*p='/0';
*b='/0';
p指針是指向常量字符串的,對*p操作就是對字符串操作,這顯然會編譯不通過的。
b是字符數組的首地址,這個數組里面的元素是‘a’、'b'、'c'、'/0',和字符串“abc”看上去是一樣,不過并不是同一個。相當于,b數組里可以存放其他東西'1'、'2'、'3'、'/0',只不過在編譯到char b[]="abc";后給這個b數組里的元素值改變了,所以對*b的操作并不影響字符串。

如果我們把token = strtok( NULL, ” “);換成token = strtok( buf, " ");則while循環會成為一個無限循環,而輸出的結果就只為:Golden。我的解釋原因如下: 在strtok函數體中有一個char 類型的指針(假設為 char *p),它的作用就是令p=s,用于保存s的起始地址。由于在隨后的處理中指針p的值會一直保存(C語言中指針的特點),因此在以后的strtok調用中用NULL來代替s的原因就是防止p被重新賦值而指向s的起始地址,從而可以保證p可以指向s的其他位置,直到最后分割完整個字符串。 但是如果用s來代替NULL,那么每次調用strtok時,p就會指向s的初始地址,從而只能獲得第一個分割出來的字串,如上面的例子中while會是一個無限循環,而輸出的結果只能是“Golden”。

2,字符串中查找字串

??? strstr()函數用來檢索子串在字符串中首次出現的位置,其原型為:
? ? char *strstr( char *str, char * substr );

【參數說明】str為要檢索的字符串,substr為要檢索的子串。

【返回值】返回字符串str中第一次出現子串substr的地址;如果沒有檢索到子串,則返回NULL。

【函數示例】strstr()函數的使用。

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main(){
  4. // 也可以改成 char str[] = "http://see.xidian.edu.cn/cpp/u/xitong/";
  5. char *str = "http://see.xidian.edu.cn/cpp/u/xitong/";
  6. char *substr = "see";
  7. char *s = strstr(str, substr);
  8. printf("%s\n", s);
  9. return 0;
  10. }
運行結果:
see.xidian.edu.cn/cpp/u/xitong/?

3,查找字符在字符串中首次出現的位置

??? strchr() 用來查找某字符在字符串中首次出現的位置,其原型為:
? ? char * strchr (const char *str, int c);

【參數】str 為要查找的字符串,c 為要查找的字符。

strchr() 將會找出 str 字符串中第一次出現的字符 c 的地址,然后將該地址返回。

注意:字符串 str 的結束標志 NUL 也會被納入檢索范圍,所以 str 的組后一個字符也可以被定位。

【返回值】如果找到指定的字符則返回該字符所在地址,否則返回 NULL。

返回的地址是字符串在內存中隨機分配的地址再加上你所搜索的字符在字符串位置。設字符在字符串中首次出現的位置為 i,那么返回的地址可以理解為 str + i。

提示:如果希望查找某字符在字符串中最后一次出現的位置,可以使用?strrchr()?函數。

【實例】查找字符5首次出現的位置。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main(){
  5. ??? char *s = "0123456789012345678901234567890";
  6. ??? char *p;
  7. ??? p = strchr(s, '5');
  8. printf("%ld\n", s);
  9. ??? printf("%ld\n", p);
  10. system("pause");
  11. ??? return 0;
  12. }
輸出結果:
12016464
12016469?

4,獲取字符串指定位置間的字符串

str.substr(startpos, length);

其中 startpos 是起始字符的序號,length 是[從 startpos 開始]取的字符串長度(包括

startpos )。

如果要取得 str 中序號 m 到 n 之間(不包括n)的子字符串需要用

str.substr(m, n-m);

?

#include<string>
#include<iostream>
using namespace std;

main()
{
string s("12345asdf");
string a=s.substr(0,4);?????? //獲得字符串s中 從第0位開始的長度為4的字符串
cout<<a<<endl;
}

輸出結果為:

1234

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383814.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383814.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383814.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++虛基類成員可見性

詳見《CPrimer》[第五版]719頁 如果繼承路徑上沒有和虛基類成員重名的成員&#xff0c;則不存在二義性&#xff0c;因為我們僅能訪問到虛基類成員。 當訪問僅有一條繼承路徑上含有和虛基類成員重名的成員&#xff0c;也不存在二義性。派生類的成員的優先級比基類的成員高&…

鏈表逆序的原理及實例

http://blog.csdn.net/wangqing_12345/article/details/51757294 尾插法建立鏈表&#xff0c;帶頭結點設鏈表節點為typedef struct node {int data;struct node *next;}node_t, *pnode_t;要求將一帶鏈表頭List head的單向鏈表逆序。 分析&#xff1a; 1). 若鏈表為空或只有一個…

C++關于虛基類、構造函數、析構函數、成員對象的兩個程序淺析

預備博客&#xff1a; C虛繼承中構造函數和析構函數順序問題以及原理 C派生類含有成員對象構造函數析構函數順序 C虛基類成員可見性 程序一如下&#xff1a; #include<iostream> using namespace std; class A { public:A(int a) :x(a) { cout << "A const…

strtok函數及其實現

頭文件&#xff1a;#include <string.h> 定義函數&#xff1a;char * strtok(char *s, const char *delim); 函數說明&#xff1a;strtok()用來將字符串分割成一個個片段。參數s 指向欲分割的字符串&#xff0c;參數delim 則為分割字符串&#xff0c;當 strtok()在參數s …

C++小型公司管理系統

項目要求&#xff1a; 編寫一個程序實現小型公司的人員信息管理系統。該公司雇員&#xff08;employee&#xff09;包括經理&#xff08;manager&#xff09;&#xff0c;技術人員&#xff08;technician&#xff09;、銷售員&#xff08;salesman&#xff09;和銷售部經理&…

Linux網絡編程“驚群”問題總結

http://www.cnblogs.com/Anker/p/7071849.html 1、前言 我從事Linux系統下網絡開發將近4年了&#xff0c;經常還是遇到一些問題&#xff0c;只是知其然而不知其所以然&#xff0c;有時候和其他人交流&#xff0c;搞得非常尷尬。如今計算機都是多核了&#xff0c;網絡編程框架也…

【Java學習筆記六】常用數據對象之String

字符串 在Java中系統定義了兩種類型的字符串類&#xff1a;String和StringBuffer String類對象的值和長度都不能改變&#xff0c;稱為常量字符串類&#xff0c;其中每個值稱為常量字符串。 StringBuffer類對象的值和長度都可以改變&#xff0c;稱為變量字符串類&#xff0c;其…

【Java學習筆記七】常用數據對象之數組

同一般的對象創建和定義一樣&#xff0c;數組的定義和創建可以分開進行也可以合并一起進行。 一維數組定義格式&#xff1a; <元素類型>[] <數組名>;//[]也可以放在數組名的后面一維數組創建格式&#xff1a; new <元素類型>[<元素個數>];執行new運…

yfan.qiu linux硬鏈接與軟鏈接

http://www.cnblogs.com/yfanqiu/archive/2012/06/11/2545556.html Linux 系統中有軟鏈接和硬鏈接兩種特殊的“文件”。 軟鏈接可以看作是Windows中的快捷方式&#xff0c;可以讓你快速鏈接到目標檔案或目錄。 硬鏈接則透過文件系統的inode來產生新檔名&#xff0c;而不是產生…

【Java學習筆記八】包裝類和vector

包裝類 在Java語言中&#xff0c;每一種基本的數據類型都有相應的對象類型&#xff0c;稱為他們基本類型的包裝類&#xff08;包裹類&#xff09;。 字節byte&#xff1a;Byte、短整數型short&#xff1a;Short 標準整數型int&#xff1a;Integer、長整數型long&#xff1a;Lo…

Linux C++線程池實例

http://www.cnblogs.com/danxi/p/6636095.html 想做一個多線程服務器測試程序&#xff0c;因此參考了github的一些實例&#xff0c;然后自己動手寫了類似的代碼來加深理解。 目前了解的線程池實現有2種思路&#xff1a; 第一種&#xff1a; 主進程創建一定數量的線程&#xff0…

Java編寫簡單的自定義異常類

除了系統中自己帶的異常&#xff0c;我們也可以自己寫一些簡單的異常類來幫助我們處理問題。 所有的異常命名都是以Exception結尾&#xff0c;并且都是Exception的子類。 假設我們要編寫一個人類的類&#xff0c;為了判斷年齡的輸入是否合法&#xff0c;我們編寫了一個名為Il…

shared_ptr簡介以及常見問題

http://blog.csdn.net/stelalala/article/details/19993425 本文中的shared_ptr以vs2010中的std::tr1::shared_ptr作為研究對象。可能和boost中的有些許差異&#xff0c;特此說明。 基本功能 shared_ptr提供了一個管理內存的簡單有效的方法。shared_ptr能在以下方面給開發提供便…

【Java學習筆記九】多線程

程序&#xff1a;計算機指令的集合&#xff0c;它以文件的形式存儲在磁盤上&#xff0c;是應用程序執行的藍本。 進程&#xff1a;是一個程序在其自身的地址空間中的一次執行活動。進程是資源申請、調度和獨立運行的單位&#xff0c;因此&#xff0c;它使用系統中的運行資源。而…

【C++11新特性】 C++11智能指針之weak_ptr

http://blog.csdn.net/xiejingfa/article/details/50772571 原創作品&#xff0c;轉載請標明&#xff1a;http://blog.csdn.net/Xiejingfa/article/details/50772571 如題&#xff0c;我們今天要講的是C11引入的三種智能指針中的最后一個&#xff1a;weak_ptr。在學習weak_ptr之…

【C++學習筆記四】運算符重載

當調用一個重載函數和重載運算符時&#xff0c;編譯器通過把您所使用的參數類型和定義中的參數類型相比較&#xff0c;巨鼎選用最合適的定義。&#xff08;重載決策&#xff09; 重載運算符時帶有特殊名稱的函數&#xff0c;函數名是由關鍵字operator和其后要重載的運算符符號…

【C++11新特性】 C++11智能指針之unique_ptr

原創作品&#xff0c;轉載請標明&#xff1a;http://blog.csdn.net/Xiejingfa/article/details/50759210 在前面一篇文章中&#xff0c;我們了解了C11中引入的智能指針之一shared_ptr&#xff0c;今天&#xff0c;我們來介紹一下另一種智能指針unique_ptr。 unique_ptr介紹 uni…

C++派生類對象和基類對象賦值

在C中&#xff0c;我們允許 將派生類對象賦給基類對象。&#xff08;不允許將基類對象賦給派生類對象&#xff09; 只會將基類對象成員賦值用基類指針指向派生類對象。&#xff08;不允許用派生類指針指向基類對象&#xff09; 基類指針只能操作基類中的成員基類引用作為派生類…

【C++11新特性】 C++11智能指針之shared_ptr

http://blog.csdn.net/Xiejingfa/article/details/50750037 原創作品&#xff0c;轉載請標明&#xff1a;http://blog.csdn.net/Xiejingfa/article/details/50750037 C中的智能指針首先出現在“準”標準庫boost中。隨著使用的人越來越多&#xff0c;為了讓開發人員更方便、更安…

C++(純)虛函數重寫時訪問權限更改問題

我們知道在Java中是自動實現多態的&#xff0c;Java中規定重寫的方法的訪問權限不能縮小。那么在C中我們實現多態的時候是否可以更改&#xff08;縮小&#xff09;訪問權限呢&#xff1f; 經過測試&#xff0c;得到的答案如下&#xff1a;如果用基類指針指向派生類對象實現多態…