字符串基础

一、字符串的三种形式

1." ";双引号之间的字符串(结尾自动添加'\0')。

2.以'\0'结尾的字符串数组。

3.string(STL);这里不做过多解释,以后再做详解。

这里留一个思考题:字符串数组和字符串有什么区别?(提示:结尾的'\0'结束符)

二、字符串的输入输出

1.scanf();遇见空格、换行输入结束。回车时自动添加‘\0’;在处理字符时,输入回车或者空格,这些字符会写入输入流中,保存在输入流中,下次如果需要输入字符时,没等输入时,会直接把这些字符读入。

scanf("%d",a);
scanf("%c",b);
//此时的输入就会造成错误,当你输入数字以回车结束后,回车符会保存在输入流中。
//后面再需要输入时,会直接把输入流中的回车符赋值给b


//解决方法
//1.
scanf("%d",a);
scanf(" %c",b);
//输入字符时,在%c前面加上空格即可把输入流中的字符吃掉


//2.
scanf("%d",a);
getchar();//可将回车符吃掉.
scanf("%c",b);

hdu 2027----统计元音

AC代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
char b[105];
int main(){
    int t;
    scanf("%d",&t);
    getchar();//吃掉输入流中回车符
    while(t--){
        gets(b);//后面会写到
        int n=strlen(b);
        int a=0,e=0,i=0,o=0,u=0;//计数,在多组输入里面
        for(int j=0;j<n;j++){
            if(b[j]=='a'||b[j]+32=='a')a++;
            if(b[j]=='e'||b[j]+32=='e')e++;
            if(b[j]=='i'||b[j]+32=='i')i++;
            if(b[j]=='o'||b[j]+32=='o')o++;
            if(b[j]=='u'||b[j]+32=='u')u++;
        }
        printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n",a,e,i,o,u);
        if(t>=1)//控制两个示例间的空行
            printf("\n");
    }
    return 0;
}

2.scanf("%s",a);

用scanf();需注意最后一位自动添加'\0'造成的数组越界问题。

char a[5];
scanf("%s",a);
//输入1 2 3 4 5会造成数组越界,最后自动添加的'\0'没有存储位置。

hdu 2017----字符串统计

AC代码:

//统计数字字符出现的次数
#include<stdio.h>
#include<math.h>
#include<string.h>
char a[10000];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int count=0;//计数,此变量一定要在多组输入里面
        scanf("%s",a);
        for(int i=0;a[i];i++){
            if(a[i]<='9'&&a[i]>='0')//是否为数组字符的判断(思考:是否是大小写?)
                count++;
        }
        printf("%d\n",count);
    }
    return 0;
}

3.如果我们要输入带空格的字符串此时就需要用别的办法了,下面有两种办法。

<1>(避免数组越界)cin.getline(a,sizeof(a));()//遇空格不结束输入,回车不写入a,同时,回车也不写入输入流中;输入数组的长度应该为a.size-1。(此输入办法不常用)

<2>(常用方法)gets(a);//读入一行,结尾自动添加'\0';回车不写入a,,同时,回车也不写入输入流中,但是此函数可能导致数组越界。

hdu 2026----首字母变大写

AC代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
char a[10000];
int main(){
    while(gets(a)){ //多组输入字符串
     int n=strlen(a);//字符串求长度的函数
     a[0]-=32;//大小写转换(思考:数字和整型如何转换?)
     for(int i=1;i<n;i++){
         if(a[i]==' ')
             a[i+1]-=32;
        }
    for(int i=0;i<n;i++)
        printf("%c",a[i]); 
    printf("\n");//输出
//    puts(a);//puts();与gets();对应的输出,此函数的输出遇到'\0'结束,eg:abc\0abc
    }
    return 0;
}

三、字符串函数(头文件:#include<cstring>)

函数的原理都是for循环来实现的。a,b均为数组,函数执行过程中可能会造成数组越界。

1.strcpy(a,b);字符串复制函数,将b复制到a中。

2.strcmp(a,b);字符串比较函数,返回值可能是>0,<0,=0;字符串的大小按照字符串来进行。

3.strcat(a,b);字符串连接函数。将b中的元素连接在a的后面(从a的'\0'开始)。

4.strlen(a);求数组a的长度(不包含'\0')。

//strlen(a);的运用

1.for(int i=0;i<strlen(a);i++)
//从时间复杂度来看,此方法不合适(推荐用以下两种)

2.int len=strlen(a);
for(int i=0;i<len;i++)

3.for(int i=0;a[i];i++)
//最后一位是'\0'(数字0)

5.atoi;字符串转int

atof;字符串转folat

atod;字符串转double

hdu 1004----Let the Balloon Rise

AC代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
char a[1005][15];//保存输入的多个字符串
int b[1005];
int main()
{
    int n;
    while(scanf("%d",&n)&&n){
        memset(b,0,sizeof(b));//每组输入前,需要清空b
        int mmax=-1;
        for(int i=0;i<n;i++)
            scanf("%s",a[i]);//输入n个字符串
        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++){
                if(strcmp(a[i],a[j])==0)//遍历比较计数
                    b[i]++;
            }
        if(mmax<b[i])
            mmax=b[i];
        }
        for(int i=0;i<n;i++){
            if(mmax==b[i]){
                printf("%s\n",a[i]);
            }
        }
    }
    return 0;
}

四、字符串的增、删、改、查。

TK 20886----字符串编辑

AC代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
char a[50];
int main(){
    char b;
    gets(a);
    int n=strlen(a);
    scanf("%c",&b);
    int index=-1;//保存找到的下标
    if(b=='D'){//删除第一次出现的字符(具体示例看题目描述)
        char c;
        scanf(" %c",&c);//注意去除输入流中的回车符
        for(int i=0;i<n;i++){
            if(a[i]==c){
                index=i;//找到该字符后,标记其下标
                break;
            }
        }
        for(int i=index;i<n;i++){
            a[i]=a[i+1];//找到该字符后,从此位置开始让后面的字符前移一个位置即可完成删除操作
        }
    }
    else if(b=='I'){//插入在最后一个字符的前面
        char d,e;
        scanf(" %c %c",&d,&e);
        for(int i=n-1;i>=0;i--){//倒序查找最后一个字符
            if(a[i]==d){
                index=i;
                break;
            }
        }
        for(int i=n+1;i>index;i--){
            a[i]=a[i-1];//找到该字符后,从最后一个字符到该字符让所有元素后移一个位置让index空出 
                        //来即可完成插入操作
        }
        a[index]=e;//最后将空出来的位置赋值即可
    }
    else{//替换全部字符
        char d,e;
        scanf(" %c %c",&d,&e);
        for(int i=0;i<=n;i++){
            if(a[i]==d){
                a[i]=e;//遍历找到后直接替换即可
                index=i;
            }
                 
        }
    }
    if(index!=-1)
            puts(a);
        else
            printf("Not exist\n");
    return 0;
}
 

注:数组初始化

1.全局变量

2.for(int i=0;i<len;i++)

       b[i]=0;

3.memset(b,0,sizeof(b));(按照内存初始化,较快)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值