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

  • 相关阅读:
    java.lang.NoSuchMethodError:antlr.collections.AST.getLine() I
    T7 java Web day01 标签HTML
    T6 s1 day19
    T5 s5 Day18
    T5 s4 Day 17
    T5 s3 day16
    T5 s2 Day 15
    T5 s1 day14
    T4 S03 day 12
    T4 S01 day1
  • 原文地址:https://www.cnblogs.com/MrLiuZF/p/14752761.html
Copyright © 2011-2022 走看看