• C语言刷题(Day1)


    ✅作者简介:大家好我是:侠客er,是一名普通电子信息工程专业的大学学生,希望一起努力,一起进步!

    📃个人主页侠客er

    🔥系列专栏:C语言刷题练习

    🏷️非常欢迎大家在评论区留言交流,互相学习!

    前言

    1. 本章我们带来几个经典得C语言练习题

    2. 不要认为之前学过C语言,刷过这些题就不愿意再做题了。对待技术,我们永远要怀以一种空杯心态。

    3. 温故而知新,可以为师矣。

    4. 老师说,每道题都要尝试用不同得解法,去思考更多的思路,摸索最优解法,久之,技术便得到质的变化。

    5. 参考资料:C 库函数 – islower() | 菜鸟教程 (runoob.com)

    题目

    在这里插入图片描述

    第一题

    从键盘上输入一个字符串,将小写字母变成大写字母。

    考点:

    1 从键盘中输入一个字符串

    常用方法
    #include 
    
    #define MAX_LENGTH 100
    
    int main() {
        char str[MAX_LENGTH];
        
        printf("请输入一个字符串:");
        scanf("%s", str);
        
        printf("您输入的字符串是:%s\n", str);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    其他方法
    #include 
    
    #define MAX_LENGTH 100
    
    int main() {
        char str[MAX_LENGTH];
        
        printf("请输入一个字符串:");
        fgets(str, sizeof(str), stdin);
        
        printf("您输入的字符串是:%s\n", str);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    解释:

    fgets(str, sizeof(str), stdin) 是一个用于从标准输入(键盘)读取一行字符串的函数调用。

    具体含义如下:

    1. str 是一个字符数组,用于存储读取的字符串。
    2. sizeof(str) 是用于获取字符数组 str 的大小,即它可以容纳的最大字符数。
    3. stdin 是一个标准输入流,表示从键盘读取输入。
    4. fgets() 函数会在读取到换行符(包括换行符)或达到指定的最大字符数(sizeof(str)-1)时停止读取。它会将读取到的字符串存储在 str 中,并在字符串末尾添加一个空字符 \0。

    2 小写字母转大写字母

    常用方法

    将小写字母转换为大写字母的经常是通过 ASCII 码进行转换。在 ASCII 码表中,小写字母的值范围是 97 到 122,而对应的大写字母的值范围是 65 到 90。通过将小写字母的 ASCII 值减去 32,可以得到对应的大写字母的 ASCII 值。

    例如

    #include 
    
    int main() {
        char lowercase = 'a';
        char uppercase = lowercase - 32;
        
        printf("小写字母:%c\n", lowercase);
        printf("对应的大写字母:%c\n", uppercase);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    其他方法

    在C语言中,可以使用标准库函数toupper(int c)将小写字母转换为大写字母,使用islower(int c)检查给定的字符是否为小写字母。确保包含 ctype.h 头文件,它包含了 toupper 和islower函数的声明。

    (1)toupper函数:

    原型:int toupper(int c);
    功能:将给定的字符转换为大写字母形式。
    参数:c是一个int类型的整数,通常是一个字符。
    返回值:转换后的大写字母,作为一个int类型的整数。

    例如

    #include 
    #include 
    
    int main() {
        char lowercase = 'a';
        char uppercase = toupper(lowercase);
        
        printf("小写字母:%c\n", lowercase);
        printf("对应的大写字母:%c\n", uppercase);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    (2)islower函数:

    原型:int islower(int c);
    功能:检查给定的字符是否为小写字母。
    参数:c是一个int类型的整数,通常是一个字符。
    返回值:如果给定字符为小写字母,则返回非零值(真);否则返回0(假)。

    #include 
    #include 
    
    int main() {
        char ch = 'a';
    
        if (islower(ch)) {
            printf("%c 是小写字母\n", ch);
        } else {
            printf("%c 不是小写字母\n", ch);
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    第一题代码

    方法一
    #include 
    #include 
    
    int main() {
       char str[100];
       
       printf("请输入一个字符串:");
       fgets(str, sizeof(str), stdin);
       
       int length = strlen(str);
    
       for (int i = 0; i < length; i++)   //遍历字符数组
       {
           if (str[i] >= 'a' && str[i] <= 'z') 
           {
               str[i] = str[i] - 32;  // 将小写字母转换为大写字母
           }
       }
       
       printf("转换后的字符串为:%s", str);
       
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    方法二
    #include 
    #include 
    
    int main() {
        char str[100];
        printf("请输入一个字符串: ");
        fgets(str, sizeof(str), stdin);
        
        int i = 0;
        while (str[i] != '\0') 
        {
            if (islower(str[i]))
            {
                str[i] = toupper(str[i]);
            }
            i++;  //换种方法遍历字符数组
        }
        
        printf("转换后的字符串为: %s\n", str);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    第二题

    从键盘上输入一个字符串,将字符串中的abc删除。

    思路

    (1)如果这道题的目的是把字符串中的所有a、b、c字符都删除,得到一个新的字符串。

    我的思路是只申请一个字符数组,遍历此数组,把除了a、b、c以外的所有字符都留下。具体实现代码如下:

    #include 
    #include 
    
    void remove_abc(char *str) 
    {
        int len = strlen(str);
        int i, j = 0;
    
        for (i = 0; i < len; i++)  //遍历字符数组
        {
            if (str[i] != 'a' && str[i] != 'b' && str[i] != 'c')
            {
                str[j++] = str[i];  //str[j++]是先把j原来的值用掉再自加,这里是把留下来的字符又放回原数组,重新对数组赋值了
            }
        }
    
        str[j] = '\0'; // 在新的字符串末尾加上结束标志符
    }
    
    int main()
    {
        char str[100];  //申请一个字符数组
    
        printf("请输入字符串: ");
        scanf("%s", str);
    
        remove_abc(str);
    
        printf("删除abc后的字符串为: %s\n", str);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    (2)如果这道题的要求是把字符串中的“abc”删除,而不是把单个的a、b、c字符删除,那么这道题可以使用指针处理。

    #include 
    #include 
    
    void removeABC(char *str)
    {
        int len = strlen(str);
        char *src = str;
        char *dest = str;  //申请的两个指针指向同一地址
    
        while (*src)
        {
            if (*src == 'a' && *(src+1) == 'b' && *(src+2) == 'c') //判断连续的abc字符串
            {
                src += 3; //从字符a开始将指针后移到3个位置,跨越掉abc这部分
            } 
            else 
            {
                *dest++ = *src++;
            }
        }
        *dest = '\0';
    }
    
    int main()
    {
        char str[100];
    
        printf("请输入一个字符串: ");
        scanf("%[^\n]%*c", str);
    
        removeABC(str);
    
        printf("删除'abc'后的字符串为: %s\n", str);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    tips

    在这里插入图片描述

    第三题

    在 C 语言中,int 类型的取值范围通常是 -2147483648 到 2147483647,进行 11 位及以上数字的加法运算,(超过了 int 类型的表示范围)。

    (1)我们使用字符数组来表示大数,并实现了自定义的 addStrings 函数来进行字符串形式的大数加法运算。该函数通过逆序遍历两个输入字符串,并模拟手工加法的方式进行计算,将结果存储在 result 字符数组中。

    (2)在 main 函数中,我们声明了两个字符数组变量 num1 和 num2,分别存储了两个 11 位数字的字符串表示。然后,我们调用 addStrings 函数将它们相加,并将结果存储在 result 字符数组中。最后,使用 %s 格式化字符串打印出结果。

    (3)这个简单的示例只适用于非负整数的加法运算,并且没有处理输入的有效性检查、溢出等情况。在实际应用中,你可能需要根据具体需求进行更完善的实现。

    #include 
    #include 
    
    #define MAX_DIGITS 100
    
    void addStrings(char* num1, char* num2, char* result) {
        int len1 = strlen(num1);
        int len2 = strlen(num2);
        int carry = 0;
        int i, j, k;
    
        // 逆序遍历两个字符串,从个位数开始相加
        for (i = len1 - 1, j = len2 - 1, k = 0; i >= 0 || j >= 0 || carry; i--, j--, k++) {
            int digit1 = (i >= 0) ? num1[i] - '0' : 0;
            int digit2 = (j >= 0) ? num2[j] - '0' : 0;
            int sum = digit1 + digit2 + carry;
    
            result[k] = sum % 10 + '0';  // 当前位的数字
            carry = sum / 10;  // 进位
        }
    
        // 反转结果字符串
        int len = k;
        for (i = 0, j = len - 1; i < j; i++, j--) {
            char temp = result[i];
            result[i] = result[j];
            result[j] = temp;
        }
    
        result[len] = '\0';
    }
    
    int main() {
        char num1[MAX_DIGITS] = "12345678901";  // 第一个 11 位数字
        char num2[MAX_DIGITS] = "98765432109";  // 第二个 11 位数字
        char result[MAX_DIGITS + 1];  // 结果字符串,预留一位存储结束符 '\0'
    
        addStrings(num1, num2, result);
    
        printf("Sum: %s\n", result);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    ARM +FPGA GPIB IP核实现
    【云原生】-MySQL压测神器HammerDB的部署及使用
    gRPC 拦截器 & 自定义命名解析
    C++实现max,min,sum,bind
    python安装wind10
    用一个性能提升了666倍的小案例说明在TiDB中正确使用索引的重要性
    FastDFS收藏起来,现在开始用Minio吧
    CentOS安装nodejs
    想要精通算法和SQL的成长之路 - 可以攻击国王的皇后
    “五育”并举育人体系构建的实践研究课题实施方案
  • 原文地址:https://blog.csdn.net/weixin_62261692/article/details/133465544