首页
登录 | 注册

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

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

题目很基础。既然是基础编程题,就尽量不要调用库函数,如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()函数只能处理大写字母,实际意义很有限。然而,本文的目的在于通过深化该练习,展示一种编程新意。足矣。


相关文章

  • 对于初学者,或者没有接触过网络编程的程序员,会觉得网络编程涉及的知识很高深,很难,其实这是一种误解,当你的语法熟悉以后,其实基本的网络编程现在已经被实现的异常简单了. 网络通信作为互联网的技术支持,已被广泛应用在软件开发中,无论是Web,服 ...
  • 如何零基础开始自学Python编程
    转载——原作者:赛门喵 链接:https://www.zhihu.com/question/29138020/answer/141170242 0. 明确目标 我是真正零基础开始学Python的,从一开始的一窍不通,到3个月后成功搭建了一个 ...
  • 这段时间一直在弄vue,当然也遇到很多问题,这里就来跟大家分享一些注册自定义模板组件的心得 首先“VUE注册组件命名时不能用大写“其实这句话是不对的,但我们很多人开始都觉得是对的,因为大家都踩过大写命名的坑 下面我们来看个例子: <d ...
  • 学了很多乱七杂八的东西,但是依然停留在前端,在工作中一直和后端交流,但是不太了解数据库是怎么回事,为了加强学习,准备学习一些关于数据库相关的东西. 说起数据库可能会有很多很多,SQLServer.Oracle.Sybase等等等,还有就是要 ...
  • 代码审查作业
    代码审查 我对结对同伴的代码进行了审查,他的有关括号匹配的代码 审查结果 功能模块名称 括号匹配问题 审查人 牛斌帅 审查日期 2019年4月25日 代码名称 括号匹配问题 代码作者 房旭 文件结构 重要性 审查项 结论 头文件和定义文件的 ...
  • More Effective C++
    More Effective C++ 35个改善编程与设计的有效方法 只有深入了解C++编译器如何解释代码, 才有可能用C++语言写出健壮的软件. C++的难学, 不仅在其广博的语法, 语法背后的语义, 语义背后的深层思维, 深层思维背后的 ...

2019 cecdns.com webmaster#cecdns.com
12 q. 0.073 s.
京ICP备10005923号