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

任务代码:

【项目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;  
}  


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值