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();
scanf("%s",&s[]);
或者:
string s;
char *c = new char();
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();
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 = "";
string s("");
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("");
string num, alpha;
unsigned int pos = ;
while ( (pos = target.find_first_of(numbers,pos)) != string::npos) {
num.push_back(target[pos]);
++pos;
}
pos = ;
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 ; }
void findLongestWord() {
ifstream in("input.txt");
string res,tmp,source;
string target("bdfghjklqpy");
unsigned int pos = ;
int maxLen = ;
int resPos = ;
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值。
C++中数字与字符串之间的转换 scanf string总结(复习必读)的更多相关文章
- C++中数字与字符串之间的转换,别人的,
C++中数字与字符串之间的转换 1.字符串数字之间的转换 (1)string --> char * string str("OK"); char * p = st ...
- C++中数字与字符串之间的转换(转)
http://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2621803.html 1.字符串数字之间的转换 (1)string --> char ...
- C++中数字与字符串之间的转换
原文地址:http://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2621803.html 1.字符串数字之间的转换 (1)string --> ...
- C++中数字与字符串之间的转换(使用CString.Format或者sprintf)
1.字符串数字之间的转换 (1)string --> char * string str("OK"); char * p = str.c_str(); (2)char ...
- [C/C++] C/C++中数字与字符串之间的转换
在C中: 方法: 1.C标准库中的sprintf, sscanf 2.C标准库还提供了 atoi, atof, atol, atoll(C++11标准) 函数将字符串转换成int,double, lo ...
- js 中数字与字符串之间的转换
数字转换为字符串 var num = 123: 1.num.toString 2."" + num 3.String(num) 将数字转化为格式化后的字符串 num.toFixe ...
- Java 中基本类型和字符串之间的转换
Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2. 使 ...
- Java学习--Java 中基本类型和字符串之间的转换
Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2. 使 ...
- 【Go】IP地址转换:数字与字符串之间高效转换
转载:https://blog.thinkeridea.com/201903/go/ip2long.html IP 地址库中 IP 地址的保存格式一般有两种,一种是点分十进制形式(192.168.1. ...
随机推荐
- Chrome浏览器 HTML5看视频卡顿
定位问题 起初以为是flash的问题,但是在B站看视频,由html播放改为flash播放后,卡顿现象消失 将相同的B站视频,用edge播放,也无卡顿现象 可以确定,问题出在chrome身上 解决方法 ...
- python中:from * import 与 import 详解
在python 中导入模块是我们最常用的功能,基本每个.py 文件中都会有 import 或者是 from * import 语句,可是,这两种方法有什么不同,有该怎么用?今天就好好分析一下. 先上定 ...
- Java基础 -1.2
Shell是脚本程序的含义 在很多编程语言中为了方便使用者进行代码的开发 都会有shell交互式编程环境 可能是为了进行一些简短的程序验证 但是在java里面就必须编写很多的结果代码才可以实现 为了解 ...
- C++11常用特性介绍——auto类型修饰符
1.C++11常用特性介绍 从本篇开始介绍C++11常用特性,大致分:关键字及新语法.STL容器.多线程.智能指针内存管理,最后讲一下std::bind和std::function 二.关键字和新语法 ...
- Day11-G - Calendar Game HDU - 1079
Adam and Eve enter this year’s ACM International Collegiate Programming Contest. Last night, they pl ...
- 本机连接虚拟机中docker启动的mysql数据库
首先要保证本机能访问虚拟机的网络 并且虚拟机开通了mysql的访问端口 进入容器 docker exec -it 容器id /bin/bash 进入mysql数据库开启远程访问权限 mysql -ur ...
- 六 一对多关联查询&关联查询小结
一对多关联查询:基于用户表关联查询订单表 在pojo中,一的一方方式多的一方的集合 在代理映射中配置查询方法,ResultMap一对多关系(注意:当两表有字段重名时,在一方字段设置别名,以免造成查询混 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:按钮大小
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 一个Java的小问题
老师今天在讨论群里抛出了一个问题,让大家尝试思考一下他所给的一段代码输出是什么. 其代码如下: class T { void foo() { this.bar(); } void bar() { Sy ...
- 解题报告:luogu P5536 【XR-3】核心城市
题目链接:P5536 [XR-3]核心城市 这题是某次月赛题. 这题我完全是看标签猜的. 优先选择直径中点即可,这里重要的是互通,很容易想到用堆维护可选的,预处理直径和距叶节点距离即可(最近),实质上 ...