字符串练习集合

1. 判断字符串s1是否是字符串s2的子串

编写一个函数judge,判断字符串s1(长度小于10)是否是字符串s2(长度小于10)的子串。如果s1是s2的子串,函数返回0;否则,返回-1。
样例输入:
asdfg
eeirasdfgdskjfsasdfgjkeuoi
样例输出:
0

#include 
using namespace std;
bool judge(const string &a,const string &b)
{
    int i,j;
    if(a.length()<b.length())
 {
  return false;
 }
    for(i=0;i<a.length();i++)
 {
        for(j=0;j<b.length();j++)
  {
            if(a[i+j]!=b[j])
            {
             break;   // 字符不相等,退出
   }
        }
        if(j==b.length()) // 达到了b.length,说明字符全部相等
        {
         return true;
  }
    }
    return false;
}
int main()
{
    string A,B;
    while(cin >>B>>A)
 {
        if(judge(A,B))
  {
   cout <<0 << endl;
  }
        else 
  {
   cout << -1<< endl;
  }
    }
    return 0;
}

2. 替换第一个子串

用sub子串替换长串src内第一次出现的obj子串。完成该函数的编写。注意:sub串与obj串的长度不一定相等。提示:
可使用的库函数 char *strstr(char *str1, const char str2);
返回str1中str2的第一次出现。charstrncpy(chardest,charsrc,size_t n);将src中前n个字符拷贝到dest指向的空间。char *strcat(char *dest,char *src);将src指向的字符串链接到dest指向的字符串后面。unsigned int strlen(char *s);获取字符串s的长度并返回。
样例输入:
abcdefxyzgklmnxyzghi
样例输出:
abcdefghigklmn

/*--------------------------------------------------
注意:部分源程序给出如下。请勿改动主函数main和其它
      函数中的任何内容,不要修改或删除“Program”和
      “End”两行注释,仅在其中填入所编写的代码。
------------------------------------------------*/
#include 
#include 
using namespace std;
int main()
{
      int j,cnt,de=0;
        char src[1000];
        cin.getline(src, 999);
        int l1=strlen(src);
        char obj[50];
        cin.getline(obj, 49);
        int l2=strlen(obj);
        char sub[50];
        cin.getline(sub, 49);
        int l3=strlen(sub);
        for(int i=0;i<l1;i++)
        {
            if(src[i]==obj[j])
            {
                  for(int k=0;k<l2;k++)
                  {
                        if(src[i+k]==obj[k])
                        {
                              de=i+k;
                              cnt++;
                        }
                  }
                  if(cnt==l2)
                  {
                        break;
                  }
            }
        }
        for(int m=0;m<=de-l2;m++)
        {
              cout<<src[m];
        }
        for(int m=0;m<l3;m++)
        {
              cout<<sub[m];
        }
        for(int m=de+1;m<l1;m++)
        {
              cout<<src[m];
        }
        return 0;
}

3.函数strdelstr

下面函数strdelstr从字符串s中删除所有字符串t,并返回删除t后的新的字符串s。如s指向"abcdbcd",t指向"bc",则执行该函数后,s指向的字符串变成 “add”,完成该函数的编写,可以使用中的函数。
样例输入:
abcdbcd
样例输出:
add

#include
#include
using namespace std;
int main()
{       
	int a[10];
        int de,df=0; 
        char s[30];
  	cin>>s;
        int l1=strlen(s);
        char t[4];
        cin>>t;
        int l2=strlen(t);
       for(int i=0;i<l1;i++)
       {
           if(s[i]==t[0])
           {    int k=0;
               for(int j=0;j<l2;j++)
               {
                   if(s[i+j]==t[j])
                   {
                       df=i+j;
                       k++;
                   }
               }
               if(k==l2)
               a[de]=df;
                de++;
           }
       }
       int g=0;
       for(int h=0;h<l1;h++)
       {
           if(h==a[g]-l2+1)
           {
               h=h+l2;
               g++;
           }
           cout<<s[h];
       }
       return 0;
}

4.判断6位密码是否正确

试编写一个判断6位密码是否正确的函数codec,若密码正确返回1,密码不正确返回0,出现错误返回-1。密码规则是:第i位数字是第i-1位数字加1后的3次方的个位数(2<=i<=6)。
比如:密码272727中第2位的’7’是第1位的’2’加1后的3次方的个位数((2+1)的3次方为27,其个位数为7),第3位的’2’是第2位的’7’加1后的3次方的个位数((7+1)的3次方为512,其个位数为2),以此类推。
输入用例:
272727
输出用例:
密码正确!

#include 
using namespace std;
//若字符是0-9之间的字符,则将其转换为对应的整数值并返回,
//否则,返回-1。
int char2int(char c)
{
        int result;
        if ((c>='0') && (c<='9')) 
  {
   result = c-'0';
  }
        else 
  {
   result = -1;
  }
        return result;
}
//判断6位密码是否正确,若正确返回1;不正确返回0,密码格式有错返回-1。
int codec(char  code[])
{
        int result = 1;
        int i, k=0;
        int a[6];
        for (i=0; i<6; i++)
        {
            a[i] = char2int(code[i]);
  	}
        for (i=0; i<6; i++)
        {
            if (a[i]==-1) 
   	    {
    		 result = -1;
   	    } 
        }
        int flag=1;
        for(int j=1;j<6;j++)
        {
            if(a[j]!=(((a[j-1]+1)*(a[j-1]+1)*(a[j-1]+1))%10))
            {
                    flag=0;
            }
        }
        if(flag==1)
        {
            result=1;
        }
        else
        {
            result=0;
        }
        return result;
}
int main()
{
        int isCorrect = 0;
        char str[7];
        for (int i=0; i<6; i++)
        { 
            cin>>str[i];
  	} 
        isCorrect = codec(str);
        if (isCorrect==1) cout << "密码正确!" << endl;
        else if (isCorrect ==0) cout << "密码不正确!" << endl;
        else cout << "输入密码不符合规则!" << endl;
}

5.字符串排序(字典序:小->大)

函数void sort(char a[][100], int len);对二维字符数组中的字符串按字典顺序从小到大排序,编写该函数。
样例输入:
dsfs
sdfa
sdfsdf
sdfb
sdfc
样例输出:
dsfs
sdfa
sdfb
sdfc
sdfsdf

#include 
#include 
#include 
using namespace std;
void sort(char a[][100], int len)
{
  char ch[100];
 int i,j;
 bool flag=1;
 for(int i=0;i<len-1&&flag;i++)
 {
  flag=0;
  for(int j=0;j<len-i;j++)
  {
   if(strcmp(a[j],a[j+1])>0)
   {
    strcpy(ch,a[j]);
    strcpy(a[j],a[j+1]);
    strcpy(a[j+1],ch);
    flag=1;
   }
  }
 }
}
int main()
{
    char ch[5][100];
    int i;
    for(i=0;i<5;i++)
    { 
      cin>>ch[i];
    } 
    sort(ch,5);
    for(i=0;i<5;i++)
    { 
     cout<<ch[i]<<endl;
    } 
}

6.数字之间插入-

实现将无符号整数num的各位数字之间插入字符’-‘输出。
例如,如果num为1234,则输出为1-2-3-4。
说明:参数out为输出流,其使用方式与标准输出流cout一样,
例如,语句out< 递归提示:要实现1234按要求输出,可以考虑先把123按要求输出,
最后再输出字符’-'和4。
样例输入:
1234
样例输出:
1-2-3-4

#include  
using namespace std;
void convert(ostream &out, unsigned long x)
{ 
    int n,m,i,flag=0;
    int a[100];
    n=x;
    m=x;
    while(n!=0)
    {
        a[i]=n%10;
        i++;
        n=n/10;
    }
    if(flag==0)
    {
        cout<<a[i-1];
        flag=1;
    }
    if(flag==1)
    {
        for(int j=i-2;j>=0;j--)
        {
            cout<<"-"<<a[j];
        }
    }
}
int main ( )
{ 
    unsigned long x;
    cin>>x;
    convert(cout, x);
    cout << endl;
    return 0;
}

7.把一个数字字符组成的字符串转换为相应的整数

编写函数,把一个数字字符组成的字符串转换为相应的整数(如 “1234” 转换为 1234)。
测试举例
样例输入:“1234”
样例输出:1234

#include 
using namespace std;
int a2i(char s[]) 
{
        int v=0,i=1;
        while(s[i]!='"')
        {
              v=v*10+s[i]-'0';
              i++;
        }
        return v;
}
int main()
{
    char str[50];
    cin>>str;
    cout<<a2i(str)<<endl;
}

8.用sub字符串替换长串src内出现所有的obj子串

用sub字符串替换长串src内出现所有的obj子串。
注意:sub串与obj串的长度不一定相等。
提示:可使用库函数strcpy, strncmp, strncpy。
strcpy函数:strcpy(char ds[], char ss[]),作用是把ss字符串复制给ds指向的内存区域。
strncmp函数:int strncmp (char ds[], char ss[], int len), 作用是比较ds串和ss串中的前面len个字符,如果相同返回0,如果ds strncpy函数:strncpy(char ds[], char ss[], int len),作用是把ss中的前len个字符复制到ds指向的内存区域。
样例输入:
abcde
bc
lk
样例输出:
alkde

#include 
#include 
using namespace std;
int main()
{
        int a[10],b[10];
      int j,de,f,e=0;
        char src[1000];
        cin.getline(src, 999);
        int l1=strlen(src);
        char obj[50];
        cin.getline(obj, 49);
        int l2=strlen(obj);
        char sub[50];
        cin.getline(sub, 49);
        int l3=strlen(sub);
        for(int i=0;i<l1;i++)
        {
            if(src[i]==obj[0])
            {     int cnt=0;
                  for(int k=0;k<l2;k++)
                  {
                        if(src[i+k]==obj[k])
                        {
                              de=i+k;
                              cnt++;
                        }
                  }
                  if(cnt==l2)
                  {
                        a[f]=de;
                        f++;
                  } 
            }
        }
        int h=0;
        for(int m=0;m<l1;m++)
        {
              if(m==a[h]-l2+1)
              {
                        for(int p=0;p<l3;p++)
                        {
                                cout<<sub[p];
                        }
                        h++;
                        m=m+l2-1;
              }
              else
              {
                        cout<<src[m];
              }
        }
        return 0;
}

9.去除字符串前后的无用空格

一个长度不超过255的字符串前后各有若干个无用的空格,编写函数stringBlank,将该字符串前后的无用空格去除。
说明:允许字符串之间出现空格。
样例输入:
apple is good (注释:尾部有空格)
样例输出:
apple is good(注释:此时尾部无空格)

#include 
#include 
#include 
using namespace std;
int  main()
{
        char  string[256],  *pStr;
        pStr = string;
        int i,j=0;
        /* 从键盘获取一个字符串,字符串中可含空格,以回车表示结束;*/
        cin.getline(string,256);
        int len=strlen(string);
        for(i=0;i<len;i++)
        {
                if(string[i]!=' ')
                {
                        break;
                }
        }
        for(j=len-1;j>=i;j--)
        {
                if(string[i]!=' ')
                {
                        break;
                }
        }
        for(int m=i;m<=j;m++)
        {
                cout<<string[m];
        }   
        return 0;
}

10.加密函数

针对输入字符串的加密规律是:对字符串的每个字母以该字母后面第4个字母加以替换。例如,字母’A’后面第4个字母是’E’,用’E’代替’A’。因此,“China"应译为"Glmre”,
注意:‘W’后面的第4个字母是’A’,‘X’后面的第4个字母是’B’。‘Y’后面的第4个字母是’C’,‘Z’后面的第4个字母是’D’。(小写字母与大写字母处理相类似)
样例输入:
aVwpFz
样例输出:
eZatJd

#include 
#include
using namespace std;
int main()
{
        char s[10];
        cin >> s;
        int len=strlen(s); 
        for(int i=0;i<len;i++)
        {
         if('a'<=s[i]&&s[i]<='v')
         {
          cout<<(char)(s[i]+4);
   }
   else if('A'<=s[i]&&s[i]<='V')
         {
          cout<<(char)(s[i]+4);
   }
   else if('w'<=s[i]&&s[i]<='z')
         {
          cout<<(char)(s[i]-22);
   }
   else if('W'<=s[i]&&s[i]<='Z')
         {
          cout<<(char)(s[i]-22);
   }
  }
        return 0;
}

11.处理字符串

去掉字符串 s 中的字符 a,并将新得到的字符串返回

#include
#include
using namespace std;
int main()
{
        int i;
        char s[100],c = 'a';
        cin>>s;
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
                if(s[i]!='a')
                {
                        cout<<s[i];
                }
        }
        cout<<endl;
        return 0;
}

12.字符串逆序存放

将字符串s中的所有字符逆序存放,例如s中为”abc”时,调用该函数后s中的字符串变为”cba”,完成该函数。
样例输入:
abc
this
OK
样例输出:
cba
siht
KO

#include
#include
using namespace std;
int main()
{
        char s[200];
        int i;
        for (i=0;i<3;i++)
        {
                cin>>s;
                int len=strlen(s);
                for(int i=len-1;i>=0;i--)
                {
                        cout<<s[i];
                }
                cout<<endl;
        }
        return 0;
}

13.对n个字符串按字母序排序

对 n 个字符串按字母序排序(首字母相同则顺序比较下一个字母)。
提示:可以使用 strcmp 函数。int strcmp(const char *s1, const char *s2) 若 s1 和 s2 相同则返回 0,若 s1 大于 s2 则返回大于 0 的值, 若 s1 小于 s2 则返回小于 0 的值。
测试举例
样例输入:Accd bsx akde bsxc abcd
样例输出:Accd abcd akde bsx bsxc

#include 
#include 
using namespace std;
int main()
{
    string str[80], temp;
    int i, j, n;
    n=5;
    for (i=0; i<n; i++)
    {
        cin>>str[i];
    }
    for (i=0; i<n; i++)
    {
        for (j=i+1; j<n; j++)
        {
            if (str[i]>str[j])
            {
                temp=str[i], str[i]=str[j], str[j]=temp;
            }
        }
    }
    for (i=0; i<n; cout<<str[i++]<<" ");
    system("pause");
    return 0;
}

14.删除字符串中的子字符串

函数char *dels(char *s, char *c);去掉字符串s中的子字符串c,并将新得到的字符串返回,完成该函数(不考虑去掉子字符串c后形成的新的子字符串c)。例如s为”abcabcd”,c为”bc”,则调用该函数后,s为”aad”。
样例输入:
abcdefghiabc
样例输入:
abc
样例输出:
defghi

#include 
#define N 100
/**
 删除在长串中指定的字符串。
 str1: 长串地址
 str2: 指定字符串地址
 str:  结果字符串地址
**/
void deleteSub(const char * str1, const char * str2, char * str)
{
 // 变量,用于各自数组下标
 int idx1 = 0;
 int idx2 = 0; 
 int idx = 0;
 // 遍历str1数组,匹配是否与str2数组相同。
 while(str1[idx1] != '\0')
 {
  while(str2[idx2] != '\0')
  {
   // 相同情况,str1 和 str2 下标自增,直到满足全部相同,此时将 str2 下标置0,匹配str1 之后的元素
   // 不相同时,直接跳出匹配,进行str1 下一元素匹配,并且将不匹配元素存入str 中。
   if(str2[idx2] == str1[idx1])
   {
    idx1 ++;
    idx2 ++;
    if(str2[idx2] == '\0')
    {
     idx2 = 0;
     break;
    }
   }
   else
   {
    idx2 = 0;
    str[idx]=str1[idx1];
    idx ++;
    idx1 ++;
    break;
   }
  }
 }
 //字符串结束
 str[idx]='\0';
}
int main(void)
{
 char str[N],substr[N],resultstr[N];
 scanf("%s %s",str,substr);
 deleteSub(str,substr,resultstr);
 printf("%s",resultstr);
 return 0;
}

你可能感兴趣的:(字符串练习集合)