一些零零散散的字符串的常识

发布于 2019-01-28  251 次阅读


字符串是存储在内存的连续字节中的一系列字符。而字符在计算机中的表示则是根据ASCII表来的。而ASCII中数字的ASCII码<大写字母的ASCII码<小写字母的ASCII码。
接下来我介绍一些关于字符串的基本常识,想看AC自动机的自行绕开。
首先我们要明白字符在计算机中是以字节的形式存储的。而在C中,字符串是以空字符结尾的,即‘\0’;
所以字符数组后总有这个东西。而且''表示的是字符,""表示的是字符串,后面有\0结尾的。
好啦,那在实践中如何操作呢?
平常我们写字符串时用C风格是这样写的

char bird[11] = "Mr. Cheeps";

用引号括起来的字符串隐式地包括结尾的空字符,因此不用显式地包括它。注意,在确定字符串所需的最短数组时,别忘了将结尾的空字符计算在内。
可是有时候我们要根据字符串的字典序比较怎么破?

#include<string.h>
std::strcmp(s1,s2);

strcmp是个有返回值的函数,它根据字符串的ASCII值来比较,如果返回0,则证明s1==s2;返回负数,s1<s2;返回正数,s1>s2;。
拼接呢?

#include<string.h>
std::strcpy(s1,s2);

strcpy将s2的内容拷贝到足够长的s1里,注意'\0'也进去了。
长度呢?

#include<string.h>
std::strlen(s1);

它返回的是存储在数组中字符串的长度,不包括空字符。
这就是一些常用的字符串函数。
那说了这么多,怎么读入输出呢?
读入

cin>>a;
scanf("%s",s1);

这个的话它遇到空白就不读了。

getline(cin,s1);

它读入一整行,碰到换行结束。

gets(s1);

这个貌似风评不是很好?但也是读入一整行。
输出

printf("%s",s1);
puts(s1);

你有没有觉得太麻烦?连这么简单的操作都要调用函数,效率还低。。。。
CPP给我们提供了一个类string,你可以像操作数值数组一样。

string s1;
string s2;
string s3;
cin>>s2>>s3;
s1=s2;//拷贝
s3+=s1;//合并

具体的自己去看吧。

凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字 符数时,空格和换行符不计算在内。

输入输出格式
输入格式:
输入文件只有一行,一个字符串 ss。
输出格式:
输出文件只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。

#include<string.h>
#include<stdio.h>
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
	freopen("title.in","r",stdin);  
    freopen("title.out","w",stdout);
    string s;
    getline(cin,s);
    int n=s.length(),ans=0;
    for(int i=0;i<n;i++)
    {
        if(s[i]>='0' && s[i]<='9')
            ans++;
        if(s[i]>='a' && s[i]<='z')
            ans++;
        if(s[i]>='A' && s[i]<='Z')
            ans++;
    }
    printf("%d",ans);
    return 0;
}

我是一个局部环,你是我的唯一极大理想。