C++ 字符串 string

1、使用前应先包含头文件string.h,有的是cstring

#include<string>

这样才能正确的cin和cout字符串。

cin时,是按照空格、TAB和换行进行分割的

例如,输入Hello World

 

 

 使用cin输入,监视输入的对象,可以看到,是分Hello 和World两次cin的,因此可以用while(cin>>str)来达到对一句话中每个单词(小字符串)的访问。

 

    while (cin >> s) {
        if (s[s.size() - 1] == '.')
            cout << s.size() - 1 << endl;
        else
            cout << s.size() << " ";

    }

上述代码是用来统计每个单词中的字母个数。

 

2、字符串分割,转整数

字符串分割函数:strtok()

返回值必须是 char []或者char*,如果是string类型想用该函数分割,必须先将string转化为char*

复制代码
void test10()
{
    char str[] = "I,am,a,student; hello world!";

    const char *split = ",; !";
    char *p2 = strtok(str,split); //str中的split字符均被替换为\0,同时提取出第一个子串
    while(p2)  //通过while循环可以分别将余下的字符串提取出来
    {
        cout<<p2<<endl;
        p2 = strtok(NULL,split);//将第一个参数置为NULL可以提取出剩下的
    }
}
复制代码

 

3、string转char*

https://blog.csdn.net/cpongo3/article/details/93854004

char * 可以转string,直接赋值即可。不能单独赋int和c字符类型值。
string s1("demo1");
string s1 = "demo";
char *p = "demo";
s1 = p;

string转char*有三种方式:c_str(),data(),copy()
c_str()返回一个c风格的字符数组,带有'\0'结束
data()返回一个数组,不自动增加‘\0’
copy()拷贝一块字符到新的内存,需要新分配一块内存用于存放。
前两个函数,原有内容发生变化,地址指的内容也会变化,使用copy不会发生这种问题。(见例子3)

const char *p = s.data();
const char * p = s.c_str();

如果不加const,要这样写

char *p = char *(s.data());
char * p = char*(s.c_str());

 

char *p = new char[s.length() + 1];
s.copy(p, string::npos);
p[s.length()] = 0;//字符串以'/0'结尾
delete p;

例子3:
std::string s1 = "demo 123456\n \0";
const char *p1 = s1.c_str();
const char *p2 = s1.data();
s1 = "345";

s1 内容发生变化后,p1和p2指针内容的地址也发生变化。

 

4、char *A与char A[]

char *A="ABC";如果没有用new建立动态数组时,使用char *A=这种形式给A赋值后,不允许对A进行修改

char A[]="ABC"; 用字符数组则可以允许修改

 

 5、cin一个字符串后,会自动在最后加一个'\0'。这体现在统计字符串长度时,用strlen(ch)统计字符串长度就是以'\0'为分界同时不包含'\0'的长度。

 

6、数字字符转整数

//假设ch为数字字符'0'到'9',将其变为对应的整数
cout<<int(ch-'0')

 

7、在没有明确说明不能用字符串库时,用string代替char*,char[]效果更好。

string s等价于 char *s=new char[n];

之后也不用特意delete

 

8、string 也可以用下标提取字符串中的特定字符,如string[1]

通过string s;

s.length()得到字符串长度;

参考:https://blog.csdn.net/qq_37941471/article/details/82107077

https://www.cnblogs.com/springsnow/p/9428657.html#_label0_12

posted @   ShineLe  阅读(410)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示