使用Shell和C语言将字符串中的大写字母转换为小写
在Linux系统开发或运维中,经常需要处理文本的大小写转换。本文将分别演示如何使用Shell脚本的内置命令,以及如何编写基础的C语言程序来实现将用户输入的字符串中大写字母转换为小写字母的功能。
结果与目标
我们的目标是实现一个通用的工具,能够接收外部传入的字符串参数,检测其中是否存在大写字母,并将其统一转换为小写形式输出。以下两种方案分别在解释型语言和编译型语言中达成这一目标。
准备条件
- 环境要求:一个可用的Linux终端(用于Shell)以及支持标准C编译的环境(如GCC)。
- 基础认知:理解命令行参数的传递方式(
$1或argv[])以及ASCII码中大写与小写字母的间隔关系(差值为32)。
真实操作顺序
第1步:使用Shell脚本进行转换
目的:利用Shell强大的文本处理工具快速实现功能。
关键代码分析:
- 函数判定:创建一个名为
haveuppernumber的函数。通过管道将输入字符串传递给tr '[:upper:]' '[:lower:]',如果转换后的内容与原内容不同,则说明包含大写字母。tr是translate的缩写,专门用于字符映射。 - 参数校验:检查运行脚本时提供的参数数量(
$# -ne 1),确保用户只传入了一个字符串,否则输出Usage提示。 - 执行逻辑:调用函数,若返回值为0(存在大写),则再次执行
tr并输出;若返回值非0,则直接输出原串。
#!/bin/bash
# name: upper_to_lower.sh
# the function is turn upper to lower
# like ABCd to abcd
haveuppernumber(){
# test if the string has upper numbers
str="$(echo $1 | tr '[:upper:]' '[:lower:]')"
if [ "$str" != $1 ] ; then
echo "[#have upper number,and i will turn them to lower:#]"
return 1 # indicate existence of uppercase
else
return 0 # no uppercase found
fi
}
if [ $# -ne 1 ] ; then
echo "Usage: $0 <string>" >&2
exit 1
fi
if haveuppernumber $1 ; then
echo $1 | tr '[:upper:]' '[:lower:]'
else
echo "[#no upper number:#]"
echo $1
fi
exit 0
在实际测试中,当输入./upper_to_lower.sh AaBbCcdd时,脚本会首先进行格式校验,随后识别出大写字符,显示提示信息并输出最终的小写结果aabbccdd。
第2步:使用C语言实现相同功能
目的:通过底层的指针操作,展示如何在没有现成文本处理库的情况下,手动遍历内存完成转换。
核心逻辑解析:
- 指针遍历:定义指针
char *q指向字符串头部,使用for(;;)循环直到遇到字符串结束符'\0'。 - ASCII码判断:C语言中,字符本质上是整数。大写字母范围是65-90 ('A'-'Z')。要将其变为小写,只需数值加32(即空格字符
' '的ASCII值),范围变为97-122 ('a'-'z')。 - 输入处理:通过
main(int argc, char *argv[])获取参数,同样需校验参数数量是否为2(程序名+1个字符串参数)。
#include <stdio.h>
#include <stdlib.h>
int haveuppernumber(char *p){
char *q = p;
for(;*q!='\0';q++){
if(*q>='A' && *q<='Z')
{
printf("[#have upper number and i will turn them to lower #]\n");
return 1;
}
}
printf("[#no upper number#]\n");
return 0;
}
void turntolower(char *p){
for(;*p != '\0';p++)
{
// 若为大写字母,加空格对应ASCII增量转为小写
if(*p>='A' && *p<='Z')
{
*p+=' ';
}
}
}
int main(int argc , char *argv[]){
if(argc != 2)
{
printf("Usage : %s <string>\n",argv[0]);
exit(-1);
}
char *p = argv[1];
if(haveuppernumber(p))
{
turntolower(p);
printf("%s\n",argv[1]);
}else{
printf("%s\n",argv[1]);
}
return 0;
}
上述C代码首先通过haveuppernumber扫描一遍字符串确认状态,然后使用turntolower修改指针所指的值,最后打印结果。
完成判断
当您在Shell中赋予脚本可执行权限(chmod +x upper_to_lower.sh)并执行后看到正确的小写输出,或者使用GCC编译C代码(gcc source.c -o converter)并获得预期运行结果时,表示操作成功。
简要总结
对于Shell脚本而言,利用tr等内置工具能以极少代码解决复杂的字符替换问题。而C语言虽然需要手动处理字符指针和ASCII编码,但能更清晰地展示数据转换的内部原理。以上就是Shell脚本和C语言将大写字母转成小写的详细内容,更多关于linux文本处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









