• 【编程小练习】字符串大写字母转小写


    【编程小练习】字符串大写字母转小写

    题目很基础。既然是基础编程题,就尽量不要调用库函数,如tolower()。

    以下给出作者的解法(思路详见注释):

    #include <assert.h>
    char *stringLower(char *pszIn/*非字符串字面量(Literal)*/) {
        //为提高效率,应由调用者保证参数有效性
        assert(pszIn != NULL); //此处assert作为双重保险(可删去)
        char *pszOrig = pszIn;
        while(*pszIn) {
            if((*pszIn >= 'A') && (*pszIn <= 'Z'))
                //简洁灵活,如转换部分字母时(ABCD...->aBcD...)
                *pszIn = "abcdefghijklmnopqrstuvwxyz"[*pszIn-'A'];
            pszIn++;
        }
        return pszOrig; //支持链式运算
    }
    
    #include <stdio.h>
    int main(void) {
        char szInput[256] = {0};
        while(scanf("%s", szInput) != EOF) {
            printf("Original String:  %s
    ", szInput);
            printf("Converted String: %s
    ", stringLower(szInput));
        }
    	return 0;
    }
    

    运行效果如下:

    Original String:  dw2325*&*(()T$*GDHJJSH89.
    Converted String: dw2325*&*(()t$*gdhjjsh89.
    

    熟悉表驱动法编程的读者很容易看出,"abcdefghijklmnopqrstuvwxyz"其实是张预置的字符转换表。更进一步,可理解为一种"模式"。基于这一思想,提取该表作为函数入参,由调用者提供。代码如下:

    char *stringConverter(char *pszIn/*非字符串字面量(Literal)*/, char *pszPattern) {
        assert(pszIn != NULL);
        if(NULL == pszPattern) //缺省模式为大写字母转小写字母
            pszPattern = "abcdefghijklmnopqrstuvwxyz";
    
        char *pszOrig = pszIn;
        while(*pszIn) {
            if((*pszIn >= 'A') && (*pszIn <= 'Z'))
                *pszIn = pszPattern[*pszIn-'A'];
            pszIn++;
        }
        return pszOrig;
    }
    
    #include <string.h>
    int main(void) {
        char szInput[256] = {0};
        char *pszMe = "Wang Xiaoyuan, Nanjing City, Jiangsu Province, P.R.C";
        printf("Original String:  %s
    ", pszMe);
        //1. 大写字母转小写
        strcpy(szInput, pszMe);
        printf("Converted String: %s(lwr)
    ", stringConverter(szInput, NULL));
        //2. 序号(从1开始)为偶数的大写字母转小写
        strcpy(szInput, pszMe);
        printf("Converted String: %s(u&l)
    ", stringConverter(szInput, "AbCdEfGhIjKlMnOpQrStUvWxYz"));
        //3. 字母表前半部的大写字母转小写
        strcpy(szInput, pszMe);
        printf("Converted String: %s(hal)
    ", stringConverter(szInput, "abcdefghijklmNOPQRSTUVWXYZ"));
        return 0;
    }
    

    运行效果如下:

    Original String:  Wang Xiaoyuan, Nanjing City, Jiangsu Province, P.R.C
    Converted String: wang xiaoyuan, nanjing city, jiangsu province, p.r.c(lwr)
    Converted String: Wang xiaoyuan, nanjing City, jiangsu province, p.r.C(u&l)
    Converted String: Wang Xiaoyuan, Nanjing city, jiangsu Province, P.R.c(hal)
    

    由于stringConverter()函数只能处理大写字母,实际意义很有限。然而,本文的目的在于通过深化该练习,展示一种编程新意。足矣。

  • 相关阅读:
    zookeeper学习笔记
    wsl笔记
    SSDB数据库笔记
    spring笔记
    redis笔记
    openresty配置
    openresty安装笔记
    mybatis笔记
    nginx配置
    STM32F373(青风)+CUBEMX快速上手
  • 原文地址:https://www.cnblogs.com/clover-toeic/p/5825569.html
Copyright © 2020-2023  润新知