C++中数字与字符串之间的转换 scanf string总结(复习必读)
1 string的scanf读入操作
C++里面控制台输入直接使用cin操作就可以了;或者getline(istringstream,string);
字符和数字加减就是字符的ASCII码和数字直接加减。
只有内置类型int,float,char,double,bool可以直接赋值,scanf读入string不能直接使用scanf直接赋值,因为string是一个类class,有专门的初始化函数,不能使用scanf,同理gets接收的也是一个char指针。编程语言自带的sizeof也是一样,不能对string进行直接操作。
string s; s.resize(100); scanf("%s",&s[0]);
或者:
string s; char *c = new char(100); scanf("%s",c);//scanf("%s",&c[0]); s = c;//给首地址
strlen是得到输入的有效字符串,而不是开辟的空间大小100.
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。--就是指实际字符串或字符数组的实际长度(不是所占空间的字节数)。
char A[6]={'a','b','\0','d','e','r'}; int i=strlen(A); //i为2,因为到’\0’结束,故实际A[]只有2个元素 sizeof()
string s; char *c = new char(100); scanf("%s",c); int len = strlen(c); s1.resize(len);//动态编译 s1.assign(c,c + len);//copy(c,c + len,s1.begin());针对其他结构
class X { int i; int j; char k; }; X x; cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐 cout<<sizeof(x)<<endl; 结果 12 同上 解释一下,在class X中,成员中最大的所占的空间为int类型所占的空间4个字节,故内存补齐,最后结果为: ((int)(实际成员所占内存空间的和/4)+1)*4
*所以不能通过sizeof(string) / sizeof(string[0])得到实际char元素个数,不管string等于多少,最后的结果都是28;因为string是一个class。
copy()用法:
此算法接收三个迭代器iterator,前两个表示一个输入范围,第三个表示目的序列的起始位置。
char 和int 的转换:
int = char - '0';
char = int + '0';
2 C++中数字与字符串之间的转换(important)
1、字符串数字之间的转换
(1)string --> char *
string str("OK");
const char * p = str.c_str();
(2)char * -->string
char *p = "OK";
string str(p);
(3)string->double
double d=atof(s.c_str());
常用函数atoi(),itoa(),to_string();
2、数字转字符串:使用sprintf()函数
char str[10];
int a=1234321;
sprintf(str,"%d",a);
--------------------
char str[10];
double a=123.321;
sprintf(str,"%.3lf",a);
--------------------
char str[10];
int a=175;
sprintf(str,"%x",a);//10进制转换成16进制,如果输出大写的字母是sprintf(str,"%X",a)
--------------------
char *itoa(int value, char* string, int radix);
同样也可以将数字转字符串,不过itoa()这个函数是平台相关的(不是标准里的),故在这里不推荐使用这个函数。
3、字符串转数字:使用sscanf()函数
char str[]="1234321";
int a;
sscanf(str,"%d",&a);
.............
char str[]="123.321";
double a;
sscanf(str,"%lf",&a);
.............
char str[]="AF";
int a;
sscanf(str,"%x",&a); //16进制转换成10进制
另外也可以使用atoi(),atol(),atof().
4、使用stringstream类
用ostringstream对象写一个字符串,类似于sprintf()
ostringstream s1;
int i = 22;
s1 << "Hello " << i << endl;
string s2 = s1.str();
cout << s2;
用istringstream对象读一个字符串,类似于sscanf()
istringstream stream1;
string string1 = "25";
stream1.str(string1);
int i;
stream1 >> i;
cout << i << endl; // displays 25
3 string类的所有函数操作总结
1、初始化string
string s = "1234"; string s("1234"); string s(n,'c');
string s(s1,pos2);//s是s2从下标pos2开始的字符的拷贝 string s(s1,pos2,len2);//s是s2从下标pos2开始len2个字符的拷贝
2、string基本操作
2.1 输入:以回车或者空格分开,或者文件末尾EOF;
cin >> s; getline(cin,s); getline(istringstream,s);
2.2 c风格的string函数(下面的必须以'\0'结尾的字符串)
strlen(p); //返回p的长度,不包含结尾‘\0’ strcmp(p1,p2); //p1 == p1 -> 返回0,p1 > p2 -> 返回正值,p1 < p2返回负值 strcat(p1,p2); // p1 + p2 strcpy(p1,p2);//p2拷贝给p1;
string s = "123";
const char *p = s.c_str();
3、 string作为顺序容器的操作
//子字符串的操作: s.substr(pos,n) ;//返回s中从pos开始的n个字符的子字符串 s.erase(pos,len);//删除从pos开始的len个字符,len不写的话删除pos 开始的所有字符 s.insert(pos,args);从pos位置插入args s.assign(args);//将s中的字符替换为args中的字符 s.append(args); s.replace(range,args);//删除range中的元素,替换为args中的元素 //args具体看primer P323
string的搜索操作:
s.find(args); s.rfind(args); s.find_first_of(args); s.find_last_of(args); s.find_first_not_of(args); s.find_last_not_of(args);
每个操作接收一个可选的第二参数,可以用来指定从什么位置开始搜索。例如args = c,pos,代表从pos位置开始搜索c,其中pos参数是可以省略的。
如果搜索失败,则返回一个string::npos的static的成员。
s.find_first_of(args);在s中查找args中任何一个字符第一次出现的位置。
#include<iostream> #include<string> #include<vector> using namespace std; int main() {string target("ad2c3d7r4e6");string numbers("0123456789");string num, alpha;unsigned int pos = 0; while ( (pos = target.find_first_of(numbers,pos)) != string::npos) {num.push_back(target[pos]);++pos;}pos = 0;while ( (pos = target.find_first_not_of(numbers, pos)) != string::npos) {alpha.push_back(target[pos]);++pos;}cout << "numbers is :\n " << num << endl;cout << "alpha is :\n " << alpha << endl;system("pause");return 0;}
void findLongestWord() { ifstream in("input.txt");string res,tmp,source;string target("bdfghjklqpy");unsigned int pos = 0;int maxLen = 0;int resPos = 0;while (getline(in, tmp)) {istringstream ss(tmp);while (ss >> source) {if (pos = source.find_first_of(target, pos) != string::npos) {continue;}if (source.size() > maxLen) {maxLen = source.size();res = source;}}}cout << res << endl;}
compare函数:
根据s是等于、大于、小于参数指定的字符串,s.compare返回0,整数或负数。
数值转换:
int i = 42;
string s = to_string(i);
int i = stoi(s);//string转换为int值。
转载于:https://www.cnblogs.com/dingxiaoqiang/p/7678477.html
C++中数字与字符串之间的转换 scanf string总结(复习必读)相关推荐
- C++中数字与字符串之间的转换
1.字符串数字之间的转换 (1)string --> char * string str("OK"); char * p = str.c_str(); (2)ch ...
- Python中数字和字符串之间的转换
数字转为字符串 这个相对比较简单 我们可以使用Python中的str函数直接转换 例如将123转换为'123' print(str(123)) 或者使用格式化 print('%s' %123) 字符串 ...
- java中数组和字符串之间的转换
java中对于数组和字符串之间的转换确实是一小的迷点. 字符串转为数组可以使用: char[] toCharArray() 将此字符串转换为一个新的字符数组. 数组转字符串: 可以直接使用new的方式 ...
- C++中数字和字符串类型的转换
// 编译环境: VS2013,C++11#include "stdafx.h" #include <iostream> #include <string> ...
- SQL中十六进制和字符串之间的转换
Java中的转换非常简单便捷,但有时候需要在后台实现转换,这里我包装成函数.Mark一下 –字符串转十六进制 CREATE FUNCTION dbo.StrToHex(@str varchar(100 ...
- java中日期与字符串之间的转换
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public cl ...
- 时间,数字 ,字符串之间的转换
package com.JUtils.base;import java.sql.Timestamp; import java.text.SimpleDateFormat;/*** 转换工具类<b ...
- Java中字节数组和十六进制字符串之间的转换
1. 概述 在本教程中,我们将看看将字节数组转换为十六进制字符串,反之亦然的不同方法. 我们还将了解转换机制并编写我们的实现来实现这一点. 2. 字节和十六进制之间的转换 首先,我们来看看字节和十六进 ...
- C++中数字和字符串的转换
1.字符串数字之间的转换 (1)string --> char * string str("OK"); char * p = str.c_str(); (2)ch ...
最新文章
- OpenCV 笔记(03)— 读取视频、通过摄像头采集视频、采集视频 canny 边缘检测
- SGU 111 Very simple problem
- hdu4370 比较抽象的最短路
- 构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范...
- linux标准c和c编译器6,linux内核中GNU C和标准C的区别
- 【直播】今晚言有三阿里云直播、赠书+书籍解读+案例剖析
- Xshell显示中文,但是不能输入中文
- 使用JavaFX构建反应系统
- [医疗开发]医疗相关名词解析
- php面向对象魔术方法,PHP面向对象中的魔术方法
- jQuery选择器之id选择器
- 7.Springcloud的Ribbon的自定义算法实现
- 数据结构-----双向链表笔记
- 一些常用路由协议默认的AD值
- 多功能雨伞项目计划书_共享雨伞商业计划书完整版.doc
- python 爬虫框架scrapy优势_Python 爬虫框架Scrapy 简单介绍
- bugzilla mysql 配置_Bugzilla 系统配置指南(Win32)
- SQLite数据库版本升级
- timeline java_Java Timeline.stop方法代码示例
- 基于TB67S109AFNAG的步进电机控制板分享
热门文章
- oracle 登录非系统用户,非Oracle用户使用操作系统验证登陆(/ as sysdba)
- c++的string转char*遇到的指针问题
- opencv 手选roi区域_利用opencv进行眼动检测
- 【SSL】java keytool工具创建自己的(localhost)(JKS)证书库
- java全局变量怎么定义_Java开发知识点:如何理解Java函数式编程?
- linux下编辑aacc.sh脚本命令,Shell命令实战详解
- 深度学习 用户画像_用户画像架构方案(持续更新)
- mysql insert 锁
- 2000字详解 当Pandas遇上超大规模的数据集该如何处理呢?
- 终于写完了!PyCharm操作手册 V1.0版本