C语言三种字符串操作

这篇博客展示了如何使用C语言处理字符串,包括计算字符串中的字母、空格和单词数量,从字符串中提取整数并求和,以及计算两个整数数组的乘积。通过`find_letter`、`find_kg`和`find_word`函数实现字符串统计,`jiequ_sz`、`nixu_str`和`qiuhe_str`处理整数求和,`chengji_str`计算乘积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<math.h>
char m[10][80];                                    //用于暂存数据
char str[80];                                    //用于读入字符串
int sz[10][80] = {0};                            //用于计算
int mid[3][80] = {0};                    //储存相乘的两数组

//任务1
int demo_1()
{
    extern char str[];            //调用全局变量 str
    printf("请输入字符串: ");
    gets(str);                    //读取字符串
    printf("字符串英文字数为:%d\n", find_letter(str)); 
    printf("字符串含空格数为:%d\n", find_kg(str));
    printf("字符串英文单词为:%d\n", find_word(str));
    printf("\n");
}

//输入 字符串 返回 所含字母个数
int find_letter(char a[])
{
    int i = 0, sum = 0;
    while (a[i] != '\0')
    {
        if ('a' <= a[i] && a[i] <= 'z' || 'A' <= a[i] && a[i] <= 'Z')
            sum++;
        i++;
    }
    return sum;
}

//输入 字符串 返回 所含空格个数
int find_kg(char a[])
{
    int i = 0, sum = 0;
    while (a[i] != '\0')
    {
        if (a[i]==' ')
            sum++;
        i++;
    }
    return sum;
}

//输入 字符串 返回 所含单词个数
int find_word(char a[])
{
    int i = 0, sum = 0;
    while (a[i] != '\0')
    {
        if (('a' <= a[i] && a[i] <= 'z' || 'A' <= a[i] && a[i] <= 'Z' <= 'z')&&(a[i+1]==' '|| a[i + 1] == ',' || a[i + 1] == '.'))
            sum++;
        i++;
    }
    return sum;
}

//任务2
int demo_2()
{
    extern char str[];            //调用全局变量 str
    extern int sz[10][80];
    int i,k,index;
    printf("请输入字符串: ");
    gets(str);                    //读取字符串
    //printf("%s\n",str);

    index= jiequ_sz(str);
    //printf("%d", index);
    
    for (k = 0; k < index; k++)
    {
        nixu_str(k);
        //用于检测返回数组
        //for (i = 0; i < 5; i++)printf("%d", sz[k][i]);
        //printf( "\n" );
    }
    
    qiuhe_str(index);
    nixu_str(10);
    printf("字符串中整数的和为: ");
    i = 0;
    while (sz[10][i] != ';')
    {
        printf("%d", sz[10][i]);
        i++;
    }
    printf("\n");
}

//从字符串中截取数组
int jiequ_sz(char a[])
{
    extern char m[10][80];
    int i = 0,index=0,j;                            //index 用于切换不同 m
    while (a[i] != '\0')                            //判断字符串是否结束
    {
        j = 0;                                        //将 j 复位
        while ('0'<= a[i]&& a[i] <='9')                //当找到的是数字时进入循环
        {
            //printf("%c",a[i]);
            m[index][j]=a[i];                        //将找到的一串数放到一个 m 中
            j++;
            i++;
                                                    //当第一串数字结束 退出内层循环 回到外层循环
        }
        //printf("%d\n",sz[index][0]);                
        if (j != 0)
        {
            m[index][j+1] = '\0';                    //将字符串末尾加上 '\0' 用于之后的识别
            index++;                                //当内层循环退出时 j 不为0 切换到下一个数组
        }                            
        i++;
    }
    return index;                                    //返回找到数组的个数
}

//将数组倒过来排列
int nixu_str(int index)
{
    extern char m[10][80];
    extern int sz[10][80];
    int num=0,i=0;
    while (m[index][num] != '\0')                    //判断字符串结尾
    {
        //printf("%c", m[0][num]);
        num++;
    }
    //将字符串倒过来放入数组
    i = num;                                            
    for (; num > 0; num--)                            
    {
        sz[index][i-num]=m[index][num-1]-'0';
        //printf("\n");
        //printf("%d,%d:%d",index,(i-num) ,sz[index][i - num]);
    }
    sz[index][i] = ';';                                //在数组后加入 ';' 用于后面判断 ';' 对应ascll码为59
    

}

//用于计算两数组的和
int qiuhe_str(int index)
{
    int j, i, sum, jin = 0, k=0;
    extern int sz[10][80];
    for (j = 0; j <= 80; j++)
    {
        if (k == index)break;                        //当找到index组数组的结尾则跳出循环
        sum = 0;                                    //将sum复位
        for (i = 0; i < index; i++)                    //有index组数据
        {
            if (sz[i][j]==';')                        //判断数组结尾
            {
                k++;
                continue;
            }
            sum += sz[i][j];
            //printf("%d\n", sum);
        }
        sum += jin;                                    //sum 加上 上一位进的位数
        jin = sum / 10;                                //计算这意味要进的位数
        sum %= 10;                                    //取出这位保留的数
        m  [10] [j]  = sum+'0';                            //转换为字符串为了方便之后的相互调用
        //printf("%c", m [10][j]);
    
    }
    m[0][j] = '\0';                                    //手动添加字符串结尾
    //printf("\n");
}

//字符串转数组
int str_sz(int index1, int index2)
{
    extern char m[10][80];
    extern int sz[10][80];
    int i=0;
    while(m[index1][i]!='\0')
    {
        sz[index2][i] = m[index1][i] - '0';
        i++;
    }
    sz[index2][i] = ';';
    //printf( "\n" );
}

//任务3
int demo_3()
{
    extern char str[];            //调用全局变量 str
    extern int sz[10][80];
    extern int mid[3][80];
    extern char m[10][80];
    int i, k, index,num,a=0,b=0;
    printf("请输入字符串: ");
    gets(str);                    //读取字符串
    //printf("%s\n",str);
    index = jiequ_sz(str);
    //printf("%d", index);
    i = 0;
    while (m[0][i] != '\0')        //读取第一段数字长度
    {
        a++;
        i++;
    }
    i = 0;
    while (m[1][i] != '\0')        //读取第二段数字长度
    {
        b++;
        i++;
    }
    for (k = 0; k < index; k++)    //转换为逆序数
    {
        nixu_str(k);
        //用于检测返回数组
        //for (i = 0; i < 80; i++)printf("%d", sz[k][i]);
        //printf( "\n" );
    }
    qiuhe_str(index);            //求和
    nixu_str(10);
    printf("和: ");
    i = 0;
    if(a!=b)i++;
    while (sz[10][i] != ';')    //显示输出
    {
        printf("%d", sz[10][i]);
        i++;
    }
    printf("\n");
    chengji_str();                //求乘积
    //printf("\n");
    num = a+b;                    //乘积的长度
    /*
    for (i = 0; i < a+b-1; i++)
    {

        //printf("i=:%d  %d\n", i,mid[2][i]);
    }
    for (i = 0; i <= 80; i++)
    {
        //printf("%d", mid[2][i]);
    }
    */
    //printf("\n");
    i = 0;
    while(i<num)                //将逆序数还原
    {
        sz [0][i] = mid [2][num-2-i];
        //printf("%d\n", sz[0][i]);
        i++;
    }
    printf("乘积:");            
    for (i = 0; i <num; i++)    //显示输出
    {
        printf("%d", sz[0][i]);
    }
    printf("\n");
}

//计算数组的乘积
int chengji_str()
{
    int i, j,n;
    extern int mid[3][80];
    extern char m[10][80];
    extern int sz[10][80];
    int cj = 0,jin=0;
    //获取两个需要相乘的数组
    for (j = 0; j <= 80; j++)
        for (i = 0; i < 2; i++)
            mid[i][j] = sz[i][j];
    //用于检测输入
    /*
    for (i = 0; i < 80; i++)printf("%d", mid[0][i]);
    printf("\n");
    for (i = 0; i < 80; i++)printf("%d", mid[1][i]);
    printf("\n");
    */
    for (i = 0; i <=80; i++)                    //求出所有个位数的乘积
    {
        //printf("i:%d\n", i);
        if (mid[0][i] == ';')break;
        j = 0;
        while (mid[1][j]!=';')
        {
            cj = 0;
            mid[2][j+i] += mid[1][j] * mid[0][i];
            //printf("j=:%d i=:%d  %d*%d=%d\n",j, i, mid[1][j], mid[0][i],mid[2][j+i]);
            //printf("cj%d:%d\n", j,cj);
            //mid[2][j+i] += jin;
            //mid[2][j+i] += cj % 10;
            //jin = cj / 10;
            j++;
        }
        //printf("i=%d:\n",i );
        //for (n = 0; n <= 10; n++)printf("%d\n", mid[2][n]);
    }
    //printf("i=%d:\n", i);
    for (n = 0; n <= 80; n++)                    //对超过10的数进行进位处理
    {
        jin = 0;
        //printf("%d\n", mid[2][n]);
        if (mid[2][n] >= 10)
            jin = mid[2][n] / 10;
            mid[2][n] %= 10;
            mid[2][n + 1] += jin;
        //printf("%d\n", mid[2][n]);
    }

/*    n = 0;
    mid[2][0] = ';';
    while(mid[0][n] != ';')
    {
        for (i = 0; i < mid[0][n]; i++)
        {
            for (j = 0; j <= 80; j++)
            {
                sz[i][j] = mid[1][j];
                //printf("%d", sz[i][j]);
            }
            //printf("\n");
        }
        qiuhe_str(mid[0][n]);
        for(i=80;i>=n;i--)
        {
            sz[10][i] = sz[10][i - n];
        }
        for (i = 0; i < n; i++)
        {
            sz[10][i] = 0;
        }
        str_sz(10, 0);
        for (j = 0; j <= 80; j++)
        {
            sz[1][j] = mid[2][j];
            //printf("%d", mid[2][j]);
        }
        qiuhe_str(2);
        str_sz(10, 10);
        for (j = 0; j <= 80; j++)
        {
            mid [2][j] = sz [10][j];
            //printf("%d", mid[2][j]);
        }
        n++;
    }*/

}
int main()
{
    int a,i=1;
    while (i)
    {
        printf("------------------------------------------------------------------------------------------------------------------------\n");
        printf("-------请选择功能-------\n");
        printf("(请输入功能对应的数字)\n");
        printf("(1)---第一种字符串---(1)\n");
        printf("(2)---第二种字符串---(2)\n");
        printf("(3)---第三种字符串---(3)\n");
        printf("(0)-------退出-------(0)\n");
        printf("------------------------------------------------------------------------------------------------------------------------\n");
        printf("功能序号:  ");
        scanf("%d", &a);
        getchar();
        switch (a)
        {
        case 1:
            demo_1();
            break;
        case 2:
            demo_2();
            break;
        case 3:
            demo_3();
            break;
        case 0:
            i = 0;
            break;
        default:
            printf("对不起该功能还在开发中。。。");
            break;

        }
        printf("------------------------------------------------------------------------------------------------------------------------\n");
    }

}

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值