zoukankan      html  css  js  c++  java
  • 字符串分割处理

    1、strtok函数

    函数原型:char * strtok (char *str, const char * delimiters);

    参数:str,待分割的字符串(c-string);delimiters,分割符字符串。
    该函数用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delimiters则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delimiters中包涵的分割字符时,则会将该字符改为 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
    需要注意的是,使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。第一次分割之后,原字符串str是分割完成之后的第一个字符串,剩余的字符串存储在一个静态变量中,因此多线程同时访问该静态变量时,则会出现错误。
    strtok例子:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4  
     5 int main()
     6 {
     7     char str[]="ab,cd,ef";
     8     char *ptr;
     9     printf("before strtok:  str=%s
    ",str);
    10     printf("begin:
    ");
    11     ptr = strtok(str, ",");
    12     while(ptr != NULL){
    13         printf("str=%s
    ",str);
    14         printf("ptr=%s
    ",ptr);
    15         ptr = strtok(NULL, ",");
    16     }
    17     system("pause");
    18     return 0;
    19 }

    输出结果如下:
    before strtok:  str=ab,cd,ef
    begin:
    str=ab
    ptr=ab
    str=ab
    ptr=cd
    str=ab
    ptr=ef

    2、strtok_s函数

    strtok_s是windows下的一个分割字符串安全函数,其函数原型如下:

    char *strtok_s( char *strToken, const char *strDelimit, char **buf);
    这个函数将剩余的字符串存储在buf变量中,而不是静态变量中,从而保证了安全性。

    实现:

     1 vector<string> 字符串空格处理1(char str[])
     2 {
     3     vector<string> ans;
     4     char *buf;
     5     char *desstr;
     6     for (desstr = strtok_s(str, " ", &buf); desstr != NULL; desstr = strtok_s(NULL, " ", &buf)) {
     7         string s(desstr);
     8         ans.push_back(s);
     9     }
    10     return ans;
    11 }

    3、strtok_r函数

    strtok_s函数是linux下分割字符串的安全函数,函数声明如下:
    char *strtok_r(char *str, const char *delim, char **saveptr);
    该函数也会破坏带分解字符串的完整性,但是其将剩余的字符串保存在saveptr变量中,保证了安全性。
    例子:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4  
     5 int main()
     6 {
     7     char str[]="ab,cd,ef";
     8     char *ptr;
     9     char *p;
    10     printf("before strtok:  str=%s
    ",str);
    11     printf("begin:
    ");
    12     ptr = strtok_r(str, ",", &p);
    13     while(ptr != NULL){
    14         printf("str=%s
    ",str);
    15         printf("ptr=%s
    ",ptr);
    16         ptr = strtok_r(NULL, ",", &p);
    17     }
    18     return 0;
    19 }
    输入结果:
    before strtok:  str=ab,cd,ef
    begin:
    str=ab
    ptr=ab
    str=ab
    ptr=cd
    str=ab
    ptr=ef

     

    4、单个字符判断处理

     

     1 vector<string> 字符串空格处理2(char str[])
     2 {
     3     //char str[]存储带有空格的字符数组,利用cin.getline(str, maxsize)
     4     vector<string> ans;
     5     string s;
     6     for (int i = 0; i < 5001; i++) {
     7         if (str[i] == ' ') {
     8             ans.push_back(s);
     9             s.clear();
    10             continue;
    11         }
    12         if (str[i] == '') {
    13             ans.push_back(s);
    14             s.clear();
    15             break;
    16         }
    17         s.push_back(str[i]);
    18     }
    19     return ans;
    20 }

     

    5、利用函数

     1 #include <unordered_map>
     2 #include <stdio.h>
     3 #include <string>
     4 #include <map>
     5 #include <iostream>
     6 #include <vector>
     7 
     8 using namespace std;
     9 
    10 int main() {
    11 
    12     vector<string> ans;
    13     while (cin.peek() != '
    ')
    14     {
    15         if (cin.peek() == ' ')
    16         {
    17             cin.get();
    18         }
    19         else
    20         {
    21             string s;
    22             cin >> s;
    23             ans.push_back(s);
    24         }
    25     }
    26 
    27     return 0;
    28 }

    6、利用getline和stringstream实现

     1 vector<string> 字符串空格处理3(string s)
     2 {
     3     /*
     4         s存储待空格得分字符串,利用getline的得到,getline(cin, s),
     5         如果输入参数是char buf[]型的字符数组,可以利用string s(buf)构造函数将其转换成string类型
     6     */
     7     stringstream ss;
     8     ss << s;
     9     string temp;
    10     vector<string> ans;
    11     while (getline(ss, temp, ' '))
    12     {
    13         ans.push_back(temp);
    14     }
    15     return ans;
    16 }

    本文来自博客园,作者:Mr-xxx,转载请注明原文链接:https://www.cnblogs.com/MrLiuZF/p/14752761.html

  • 相关阅读:
    [Leetcode] Maximum Gap
    [Leetcode] Reverse Integer
    [Leetcode] Pow(x, n)
    Theano2.1.21-基础知识之theano中多核的支持
    Theano2.1.3-基础知识之更多的例子
    Theano2.1.17-基础知识之剖析theano的函数
    Theano2.1.16-基础知识之调试:常见的问题解答
    Theano2.1.15-基础知识之theano如何处理shapre信息
    Theano2.1.14-基础知识之理解为了速度和正确性的内存别名
    Theano2.1.13-基础知识之PyCUDA、CUDAMat、Gnumpy的兼容
  • 原文地址:https://www.cnblogs.com/MrLiuZF/p/14752761.html
Copyright © 2011-2022 走看看