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

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

题目很基础。既然是基础编程题,就尽量不要调用库函数,如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\n", szInput);
        printf("Converted String: %s\n", 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\n", pszMe);
    //1. 大写字母转小写
    strcpy(szInput, pszMe);
    printf("Converted String: %s(lwr)\n", stringConverter(szInput, NULL));
    //2. 序号(从1开始)为偶数的大写字母转小写
    strcpy(szInput, pszMe);
    printf("Converted String: %s(u&l)\n", stringConverter(szInput, "AbCdEfGhIjKlMnOpQrStUvWxYz"));
    //3. 字母表前半部的大写字母转小写
    strcpy(szInput, pszMe);
    printf("Converted String: %s(hal)\n", 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()函数只能处理大写字母,实际意义很有限。然而,本文的目的在于通过深化该练习,展示一种编程新意。足矣。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值