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();

  上代码吧还是,一直看文字稍显枯燥,一看代码就精神了:

 1 #include <iostream>
2 #include <algorithm>
3 #include <string>
4 #include <sstream>
5 #include <set>
6 using namespace std;
7
8 int main() {
9 string str;
10 while (1) {
11 getline(cin, str);
12 if (str[0] == '#') break;
13
14 set<string> ans;
15 string a;
16 stringstream ss(str);
17 /*
18 stringstream ss;
19 ss << str;
20 */
21 /*
22 stringstream ss;
23 ss.str(str);
24 */
25 while(ss >> a)
26 ans.insert(a);
27 cout << ans.size() << endl;
28 }
29 return 0;
30 }

hdu2072单词数

  hdu1106排序:题意:以5为分隔符,从一串数字中提取出单个数字,排序输出.(要考虑到前导0和好几个5连续出现的时候)。

  解法一:使用C++STL中的stringstream实现,因为stringstream是以空格表示一个字符串结束的,所以可以加载到字符串流的之前进行预处理(将数字串中5替换为空格)。然后再使用上面学到的stringstream方法进行提出子串、转换为数字、存到一维数组里面、排序(可以使用C++STL中的sort函数,也可以使用冒泡、选择、快排、插入排序、二分排序等方法)、输出即可。具体细节见代码:

 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
8 #include <iostream>
9 #include <algorithm>
10 #include <string>
11 #include <cstring>
12 #include <cstdio>
13 #include <sstream>
14 using namespace std;
15
16 int main() {
17 string s;
18 int a[1010];
19 while (cin >> s) {
20 int len = s.length(), k = 0;
21 for (int i = 0; i < len; ++i) {
22 if (s[i] == '5') {
23 s[i] = ' ';
24 }
25 }
26 stringstream ss(s);
27 string res;
28 while (ss >> res) {
29 int len1 = res.length();
30 int num = 0;
31 for (int i = 0; i < len1; ++i) {
32 num = num*10 + (res[i]-'0');
33 }
34 a[k++] = num;
35 }
36 sort (a, a + k);
37 for (int i = 0; i < k; ++i) {
38 if (i) {
39 printf(" ");
40 }
41 printf ("%d", a[i]);
42 }
43 cout << endl;
44 }
45 return 0;
46 }

hdu1106排序(stringstream)

  解法二:使用C语言string.h中的strtok函数:

  语法:

    char *strtok(char *s, const char *delim);
  功能:Parse S into tokens separated by characters in DELIM.If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point.
     (以delim中的字符串为分界符,将s分割为一个一个的子串)
  返回值:
    1、从s开始的位置开始分割,到字符串结束的时候返回NULL;
    2、每找到一个子串就退出,当再次调用strtok函数的时候从上一次停下来的位置继续寻找,知道字符串的末尾,返回NULL。
  注意:strtok会破坏原字符串的结构

  对于这道题来说,毫无疑问就是用"5"为分隔符,取出一个子串,使用atoi函数转换为整数(头文件stdlib.h传入参数为字符串指针类型,这里扩展一个atol函数,是将字符串转换为长整型),存到一个数组里面排序输出即可。
 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就会接着上一次的位置分割)

   先总结这些,再有学习到会更新。

hdu 2072 1106学一波字符串分割,C语言与C++两种方法的更多相关文章

  1. Python将字符串转化为对应类名的两种方法

    way first: 1 from django.utils.module_loading import import_string 2 ValidationError = import_string ...

  2. C# 实现数字字符串左补齐0的两种方法

    ); MessageBox.Show(sss); return; 代码如上,自动补齐前面的0

  3. 选中没有选中的复选框,匹配含有某个字符串的正则,json取值的两种方法,把变量定义在外面跟里面的区别

    一.筛选没有选中的复选框:not("input:checked") 二.匹配有VARCHAR的字符串:".*VARCHAR.*?" 三.json取值的两种方法 ...

  4. Linux 的shell 字符串截取很有用。有八种方法。

    一 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.linuxidc.com/123.htm 1  # 号截取,删除左边字符,保留右边字符. echo ${va ...

  5. 【转】Java中字符串中子串的查找共有四种方法(indexof())

    原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int ...

  6. 在PHP代码中处理JSON 格式的字符串的两种方法:

    总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...

  7. Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字 ...

  8. Python 中格式化字符串 % 和 format 两种方法之间的区别

    Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...

  9. Js 字符串拼接的两种方法

    字符串拼接的两种方法 用数组的方法的好处是:避免变量重新定义.赋值 <!DOCTYPE html> <html lang="en"> <head> ...

随机推荐

  1. Spring基于XML的IoC

    Maven导入Spring依赖 <dependency> <groupId>org.springframework</groupId> <artifactId ...

  2. Java基础知识-简明阐述双亲委派机制及作用

    1.双亲委派机制及作用 1.1 什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类 ...

  3. C# 8 - Nullable Reference Types 可空引用类型

    在写C#代码的时候,你可能经常会遇到这个错误: 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作. 可空引用类型 Null Reference Type 所以, ...

  4. python基础之流程控制(2)

    今天将是基础篇的最后一篇,咱们来补上最后一个内容,流程控制for循环 For 循环 一.为什么有for循环? for循环能做的事情,while循环全都可以实现,但是在某些情境下,for循环相对于whi ...

  5. [Fundamental of Power Electronics]-PART II-9. 控制器设计-9.3 关键项1/(1+T)和T/(1+T)以及闭环传递函数的构建

    9.3 关键项\(1/(1+T)\)和\(T/(1+T)\)以及闭环传递函数的构建 从式(9.4)到(9.9)的传递函数可以很容易的由图形代数方法进行构建.假设我们已经分析了反馈系统模块,并且已经画出 ...

  6. Dynamics CRM9.0安装CRM的时候提示Microsoft.Crm.Setup.Server.RegisterSandboxServiceAction操作失败

    如图: 这种问题有两种情况会遇到.第一种是一个域装多套CRM产品会提示这个问题这个问题是解决不了的. 还一种情况就是安装9.0及以后的产品先安装了ADFS再安装产品就会提示这个错误. 第二种解决办法就 ...

  7. ASP.NET Core可视化日志组件使用

    前言 今天站长推荐一款日志可视化组件LogDashboard,可以不用安装第三方进程,只需要在项目中安装相应的Nuget包,添加数行代码,就可以实现拥有带Web页面的日志管理面板,十分nice哦. 下 ...

  8. Java(152-170)【继承、super、this、抽象类】

    1.继承的概述 继承是多态的前提 继承主要解决的问题是共性抽取 2.继承的格式 在继承的关系中,子类可以当做父类看待 代码复用的效果 package cn.itcast.day09.demo01; / ...

  9. Linux递归压缩图片脚本

    1 压缩图片 使用ImageMagick的convert命令进行压缩图片,一般只需要一个指定压缩质量的参数,比如: convert -quality 75 1.jpg 1_compress.jpg 可 ...

  10. HashSet、CopyOnWriteArraySet、ConcurrentSkipListSet源码解析(JDK1.8)

    目录 HashSet源码解析 HashSet简单使用的demo HashSet中的变量 HashSet的构造函数 HashSet的add方法 HashSet的iterator方法 HashSet的si ...