hdu 2072 1106学一波字符串分割,C语言与C++两种方法
2017-04-11 16:50
330 查看
hdu2072:题意:输出给定字符串中的单词数(一个句子中可能有两个相同的单词),这里的思想是把每个单词取出来,放入set(这个集合容器中不允许有相同的元素)中,最后输出该集合的大小即可。
现在的问题就是怎么分割字符串,这里介绍一个C++STL里面的工具——stringstream,其被称之为字符串流,
<这里扩展一点>:
istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
strstream类同时可以支持C风格的串流的输入输出操作。
可以将一个字符串以C风格流的形式输出,输出的时候会在空格的位置停顿。下面说明一下怎么定义:
1、使用stringstream 变量名(要分割的字符串);
2、stringstream 变量名; 变量名.str(要分割的字符串);
3、stringstream 变量名; 变量名 << 要分割的字符串; // 第二句的位置不可以换。
使用的时候先定义一个中间变量(类似迭代器一样去存取出来的字符串)使用while (字符串流 >> 中间变量) while循环中对取出的字符串进行入集合的操作。(while里面的条件的前后的顺序也是不可以颠倒的,原因类似cin、cout)。
这里需要注意一个问题:stringstream不会主动释放内存,所以如果在一个程序中重复使用一个字符串流的时候需要清空一下;使用变量名.str(""); 或者 变量名.clear();
上代码吧还是,一直看文字稍显枯燥,一看代码就精神了:
hdu1106排序
再加一点笔记:
除了在string.h下的strtok之外,鄙人认为其他比较方便的还有:
1、strpbrk: char *strpbrk( const char *str1, const char *str2 );
函数返回一个指针,它指向字符串str2中任意字符在字符串str1 首次出现的位置,如果不存在返回NULL。
2、strchr:char *strchr( const char *str, char ch );
函数返回一个指针,它指向字符ch 在字符串str首次出现的位置,如果匹配失败,返回NULL。
3、strstr: char *strstr( const char *str1, const char *str2 );
函数返回一个指针,它指向字符串str2 首次出现于字符串str1中的位置,如果没有找到,返回NULL。
4、strtok: char *strtok( char *str1, const char *srt2 );
函数返回字符串str1中紧接“标记”的部分的指针, 字符串str2是作为标记的分隔符。如果分隔标记没有找到,函数返回NULL。为了将字符串转换成标记,第一次调用str1 指向作为标记的分隔符。之后所以的调用str1都应为NULL。(第二次调用的时候str1位置给NULL就会接着上一次的位置分割)
先总结这些,再有学习到会更新。
现在的问题就是怎么分割字符串,这里介绍一个C++STL里面的工具——stringstream,其被称之为字符串流,
<这里扩展一点>:
istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
strstream类同时可以支持C风格的串流的输入输出操作。
可以将一个字符串以C风格流的形式输出,输出的时候会在空格的位置停顿。下面说明一下怎么定义:
1、使用stringstream 变量名(要分割的字符串);
2、stringstream 变量名; 变量名.str(要分割的字符串);
3、stringstream 变量名; 变量名 << 要分割的字符串; // 第二句的位置不可以换。
使用的时候先定义一个中间变量(类似迭代器一样去存取出来的字符串)使用while (字符串流 >> 中间变量) while循环中对取出的字符串进行入集合的操作。(while里面的条件的前后的顺序也是不可以颠倒的,原因类似cin、cout)。
这里需要注意一个问题:stringstream不会主动释放内存,所以如果在一个程序中重复使用一个字符串流的时候需要清空一下;使用变量名.str(""); 或者 变量名.clear();
上代码吧还是,一直看文字稍显枯燥,一看代码就精神了:
1 /* 2 * > File Name: HDU1106.cpp 3 * > Author: Ddlm2wxm 4 * > Mail: Ddlm2wxm@163.com 5 * > Created Time: 2017/4/11 16:10:22 6 *****************************************/ 7 #include <stdio.h> 8 #include <string.h> 9 #include <stdlib.h> 10 11 int cmp(const void *a, const void*b) { 12 return *(int*)a-*(int*)b; 13 } 14 15 int main() { 16 int n, i, cnt; 17 int b[1100]; 18 char a[1100], *p; 19 while(~scanf("%s", a)) { 20 cnt = 0; 21 p = strtok(a, "5"); 22 while(p != NULL) { 23 b[cnt++] = atoi(p); 24 p = strtok(NULL,"5"); 25 } 26 qsort(b,cnt,4,cmp); 27 printf("%d",b[0]); 28 for(i=1; i<cnt; i++) 29 printf(" %d",b[i]); 30 printf("\n"); 31 } 32 return 0; 33 }
hdu1106排序
--------------------------------------------------------------------------------------------------
再加一点笔记:
除了在string.h下的strtok之外,鄙人认为其他比较方便的还有:
1、strpbrk: char *strpbrk( const char *str1, const char *str2 );
函数返回一个指针,它指向字符串str2中任意字符在字符串str1 首次出现的位置,如果不存在返回NULL。
2、strchr:char *strchr( const char *str, char ch );
函数返回一个指针,它指向字符ch 在字符串str首次出现的位置,如果匹配失败,返回NULL。
3、strstr: char *strstr( const char *str1, const char *str2 );
函数返回一个指针,它指向字符串str2 首次出现于字符串str1中的位置,如果没有找到,返回NULL。
4、strtok: char *strtok( char *str1, const char *srt2 );
函数返回字符串str1中紧接“标记”的部分的指针, 字符串str2是作为标记的分隔符。如果分隔标记没有找到,函数返回NULL。为了将字符串转换成标记,第一次调用str1 指向作为标记的分隔符。之后所以的调用str1都应为NULL。(第二次调用的时候str1位置给NULL就会接着上一次的位置分割)
先总结这些,再有学习到会更新。
相关文章推荐
- C++ 分割字符串两种方法
- 开发JAVA编程中字符串分割的两种方法
- "找出字符串中第一个不重复的字符"和"找出字符串中最后一个重复的字符"的两种方法的C++实现
- c/c++ 原生字符串分割简易方法
- C语言编程:字母大小写转换以及求字符串长度的两种方法
- 开发JAVA编程中字符串分割的两种方法
- C++ 字符串分割方法 实现split
- HDU 1106 排序 其实是字符串分割
- C++输入一个字符串,把其中的字符按照逆序输出的两种方法
- C++常用字符串分割方法实例汇总
- 初学者入门:教你字符串分割的两种方法
- C++ 在尾部添加字符串(两种方法) |C++ 连接字符串
- hdu 1106 排序(字符串的分割)
- 字符串分割的两种方法
- 开发JAVA编程中字符串分割的两种方法
- C++实现字符串替换的两种方法
- 小例子拾掇知识点之c/c++篇第1话--c分割字符串方法
- C++常用字符串分割方法实例汇总
- C++输入一个字符串,把其中的字符按照逆序输出的两种方法解析
- hdu1106 java字符串分割