C语言:字符数组与字符串处理 实践 1

来源:互联网 发布:海王星炒股软件下载 编辑:程序博客网 时间:2024/05/23 00:07

任务代码:

【项目1-M$pszi$y是嘛意思?】
背景:小明让同学传纸条给小丽。小丽接到会心一笑,大家却不知所云。纸条上写着M$pszi$y,两人暗中约定是,真实字符为实际字符前面的第4个!M$pszi$y是神马意思?推算一下,或从ASCII码表中查一下,自然是I love u。
(1)小明请你写一个程序,在给小丽写情书时,再不用费功夫自己“翻译”,原信中每一个字符加密为其后的第4个字符。例,输入I love u,输出M$pszi$y。
(2)小丽请你写一个程序,在看小明的情书时,让程序帮着“解密”。因为有同学知道了他们俩人的“加密”手段,决定纸条由人传,加密数字(1-9)用两人约好的手势传,所以解密时,需要将加密数字作为程序输入。例,输入M$pszi$y(回车)4,输出I love u
(3)小刚常帮着传纸条,想知道俩人的秘密,但不知道加密数字,于是写了一个程序,可以列出所有可能的情况。例,输入M$pszi$y,多行输出中必然有一行是I love u。你就是小刚,写出这个程序来吧。

执行情况:


(1)

#include <stdio.h>int main(){    char str1[50],str2[50];    printf("请输入原句:");    gets(str1);        //Encryption    int i=0,j=0;    while(str1[i]!='\0')     {         str2[j]=str1[i]+4;         j++;         i++;     }        //output    printf("加密后的字符串是:");    puts(str2);    return 0;}


答案写法:

#include<stdio.h>    int main()    {        char s[80], t[80];        int i;        gets(s);        for(i=0; s[i]!='\0'; i++)        {            t[i] = s[i]+4;        }        t[i] = '\0'; //此时i为?        printf("%s\n", t);        return 0;    } 



(2)

#include <stdio.h>int main(){    char str1[50],str2[50];    printf("请输入你想要的解密的语句:");    gets(str1);        //decrypt    int i,j=0;    for(i=0;str1[i]!='\0';i++)    {        str2[j++]=str1[i]-4;    }        //output    printf("输出解密后的语句:");    puts(str2);    return 0;}


答案写法:

#include<stdio.h>    int main()    {        char s[80], t[80];        int i, n;        printf("输入待解密句子:");        gets(s);        printf("输入加密数字:");        scanf("%d", &n);        char *pt = t;    //指针法访问数组    for(i=0; *(s+i)!='\0'; i++,pt++)  //指针法访问数组      {            *pt = s[i]-n;        }        *pt = '\0';        printf("%s\n", t);        return 0;    }   

(3)

#include<stdio.h>void  decrypt(char [],char [],int);int main(){    char s[80], t[80];    int num;    printf("输入待解密句子:");    gets(s);        //decrypt    for(num=0;num<10;num++)    {        decrypt(s,t,num);        printf("第%d种解密:%s\n", num+1,t);    }        return 0;}void decrypt(char *s,char *t,int num){    char *pt = t;    int i;    for(i=0; *(s+i)!='\0'; i++,pt++)    {        *pt = s[i]-num;    }    *pt = '\0';}

或者子方程可以改成(*s ,*t 已经是指向数组的指针):

void decrypt(char *s,char *t,int num){    int i;    for(i=0; *(s+i)!='\0'; i++)    {        *(t+i)= s[i]-num;    }    *(t+i)= '\0';}


答案写法:

#include<stdio.h>    int main()    {        char s[80], t[80], *pt;        int i, n;        printf("输入待解密句子:");        gets(s);        for(n=1; n<9; n++)        {            pt = t;            for(i=0; *(s+i)!='\0'; i++,pt++)            {                *pt = s[i]-n;            }            *pt = '\0';            printf("%s\n", t);        }        return 0;    }  

【项目2-字符统计】

下面的程序可以统计出一个字符串中数字字符的个数:

#include <stdio.h>int main(){    char str[50];    int i=0,n=0;    printf("输入字符串:");    gets(str);    while(str[i]!='\0')    {        if(str[i]>='0'&&str[i]<='9') n++;        i++;    }    printf("其中的数字个数是: %d\n", n);    return 0;  }


请分别编制程序,完成下面的处理:
(1)统计字母'A'出现的次数;
(2)统计字符串中(大/小写)字母个数;
(3)统计每一个元音字母个数
(4)统计每一个数字字符出现的次数;
    提示:可以定义一个数组int a[10],保存’0’-’9’在字符串中出现的次数(例a[0]表示字符’0’的个数)
(5)统计每一个字母出现的个数

#include <stdio.h>#include <ctype.h>int Anum(char *);//统计A的个数void BSletter(char *);//统计大小写字母的个数void VowelNum(char *);//统计每个元音字母的个数void NumCount(char []);//统计每个数字字符的个数void alphaCount(char []);//统计每个字符出现的个数int main(){    char str[50];    int i=0,n=0;    printf("输入字符串:");    gets(str);    while(str[i]!='\0')    {        if(str[i]>='0'&&str[i]<='9') n++;        i++;    }    printf("其中的数字个数是: %d\n", n);        //统计A的个数    int num;    num=Anum(str);    printf("其中A出现的次数是%d。\n",num);        //统计大小写字母的个数    BSletter(str);       //统计每一个元音字母    VowelNum(str);        //统计数字字符的个数    NumCount(str);        //统计每个字母出现的个数    alphaCount(str);        return 0;  }int Anum(char *s){    int i,num=0;    for(i=0;*(s+i)!='\0';i++)    {        if(*(s+i)=='A')            num++;    }    return num;}void BSletter(char *s){    int i,lowernum=0,uppernum=0;    for(i=0;*(s+i)!='\0';i++)    {        if(islower(*(s+i))) lowernum++;        if(isupper(*(s+i))) uppernum++;    }    printf("大写字母个数:%d\n",uppernum);    printf("小写字母个数:%d\n",lowernum);}void VowelNum(char *s){    int i;    char str[50];//用于装全部转换为小写字母字符串    int VowelNum[5]={0};//设置一个数组来装元音字母,a,e,i,o,u;        for(i=0;*(s+i)!='\0';i++)    {        str[i]=tolower(*(s+i));//全部转换为小写字母    }        //统计    int j;    for(j=0;j<i;j++)    {    if(str[j]-'a'==0)        VowelNum[0]+=1;    else if(str[j]-'e'==0)        VowelNum[1]+=1;    else if(str[j]-'i'==0)        VowelNum[2]+=1;    else if(str[j]-'o'==0)        VowelNum[3]+=1;    else if(str[j]-'u'==0)        VowelNum[4]+=1;    }    printf("字符串中总共有a,e,i,o,u元音字母个数分别是:%d,%d,%d,%d,%d\n",VowelNum[0],VowelNum[1],VowelNum[2],VowelNum[3],VowelNum[4]);    }void NumCount(char s[]){    int num[10]={0},i;//注意这里的初始化很重要    for(i=0;s[i]!='\0';i++)    {        if(s[i]>='0' && s[i] <= '9' )        {          num[s[i]-'0']++;//使用技巧动态分配数组在数组中的储存        }    }        printf("每个数字的个数分别是:\n");    int j=0;    while(j<10)    {        printf("\'%d\'---%d\n",j,num[j]);//双引号中的单引号是 \'        j++;    }    printf("\n");}void alphaCount(char s[]){    int Upletter[26]={0},Lowerletter[26]={0},i;//注意这里的初始化很重要    for(i=0;s[i]!='\0';i++)    {        if(s[i]>'a' && s[i] <= 'z' )        {            Lowerletter[s[i]-'a']++;//动态储存小写字母        }        else if(s[i]>'A' && s[i]<='Z')        {            Upletter[s[i]-'A']++;//动态储存大写字母        }    }        //output    printf("小写字母部分:\n");    int m=0,n=0;    while(m<26)    {        if(Lowerletter[m]!=0)         printf("\'%c\'---%d\n",(char)(m+97),Lowerletter[m]);//方法1 表示        m++;    }    printf("\n");        printf("大写字母部分:\n");    while(n<26)    {        if(Upletter[n]!=0)         printf("\'%c\'---%d\n",n+'A',Upletter[n]);//方式2 表达        n++;    }}


项目3-字符串复制】
下面的程序,将str1中除空格外的所有字符,复制到了str2中。

#include <stdio.h>#include <string.h>int main(){    char str1[100]="I am a happy boy\'s daddy.",str2[100];    int i=0,j=0;    while(str1[i]!='\0')    {        if(str1[i]!=' ')        {            str2[j]=str1[i];            j++;        }        i++;    }    str2[j]='\0';//切记!!    printf("去除空格后的字符串: %s\n", str2);    return 0;}
请分别编制程序,完成下面的处理:
(1)完整复制字符串;
(2)将str1和str2接起来存放到str3中;
(3)去除str4中的空格,仍保存在str4中;(str4字符串和str1一样)
(4)将str1和str2连接起来,仍存放在str1中;


自己的代码:

#include <stdio.h>#include <string.h>int main(){    char str1[100]="I am a happy boy\'s daddy.",str2[100];    //字符串复制    strcpy(str2, str1);    printf("复制后的str2中的字符串是:%s\n",str2);        //字符串连结    char str3[100];    strcat(str1, str2);//将str1连结到str2后面,返回str1    strcpy(str3,str1);    printf("连结后存储在str3中的字符串是:%s\n",str3);        //去除str4中的空格,仍保存在str4中;    char str4[100]="I am a happy boy\'s daddy.";    int i=0;    while(str4[i]!='\0')    {        if(str4[i]==' ')            str4[i]=str4[i+1];        i++;    }    printf("去掉空格后的str4是:%s\n",str4);        //将str1和str2连接起来,仍存放在str1中;    strcat(str1, str2);    printf("将str1和str2链接起来后任然存在str1中:%s\n",str1);        return 0;}

答案代码:

(1)

#include <stdio.h>  int main()  {      char str1[100]="I am a happy boy\'s daddy.",str2[100];      int i,j;      for(i=0,j=0; str1[i]!='\0'; i++)      {          str2[j]=str1[i];          ++j;      }      str2[j]='\0';//切记!!      printf("复制后的字符串: %s\n", str2);      return 0;  }  


或者:

#include <stdio.h>  int main()  {      char str1[100]="I am a happy boy\'s daddy.",str2[100];      int i=0,j=0;      while((str2[j++]=str1[i++])!='\0');//如此表达式!循环体为空,自左向右运算    printf("复制后的字符串: %s\n", str2);      return 0;  } 


(2)

#include <stdio.h>  int main()  {      char str1[20]= {"int i,a[100];"};      char str2[20]= {"//注释: 定义变量"};      char str3[40];      int i=0,j=0;      while(str1[j]!='\0')  //复制str1      {          str3[i++]=str1[j++];      }      j=0;    //下面复制str2      while(str2[j]!='\0')      {          str3[i++]=str2[j++];      }      str3[i]='\0';  //一定要保证str3中有'\0'      printf("处理后的字符串是: %s\n", str3);      return 0;  }  

(3)

#include <stdio.h>  int main()  {      char str[40]= {"I am a boy."};      int i=0,j=0;      while(str[j]!='\0')  //找到str的结束      {          if(str[j]!=' ')              str[i++]=str[j++];  //如果str[i]不是空格,将复制          else              j++;    //str[j]为空格时,没有进行复制                      //j++而没有i++,所以只要有空格,j的值一定会大于i的                      //不管是否有空格,j一直勇往直前,i则遇空格就休息      }      str[i]='\0';    //str[i]处是复制结束后的位置      printf("处理后的字符串是: %s\n", str);      return 0;  }  

(4)

#include <stdio.h>  int main()  {      char str1[40]= {"I am a boy."};      char str2[20]= {"//注释: 废话一句"};      int i=0,j=0;      while(str1[i]!='\0')  //找到str1的结束      {          i++;      }      j=0;    //下面复制str2      while(str2[j]!='\0')      {          str1[i++]=str2[j++];      }      str1[i]='\0';  //一定要保证str1中有'\0'      printf("处理后的字符串是: %s\n", str1);      return 0;  }  


原创粉丝点击