您的位置:首页 > 编程语言 > C语言/C++

c,c++中字符串处理函数strtok,strstr,strchr,strsub

2018-01-24 22:55 736 查看
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()函数的使用。

#include<stdio.h>
#include<string.h>
int main(){
// 也可以改成 char str[] = "http://see.xidian.edu.cn/cpp/u/xitong/";
char *str = "http://see.xidian.edu.cn/cpp/u/xitong/";
char *substr = "see";
char *s = strstr(str, substr);
printf("%s\n", s);
return 0;
}

运行结果:
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首次出现的位置。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char *s = "0123456789012345678901234567890";
    char *p;
    p = strchr(s, '5');
printf("%ld\n", s);
    printf("%ld\n", p);

system("pause");
    return 0;
}

输出结果:
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: