gpt4 book ai didi

c - 如何交替交换大写和小写?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:30 26 4
gpt4 key购买 nike

我正在编写一个程序,可以交替地将大写字母转换为小写字母和将小写字母转换为大写字母。以下是一些示例。

abcde -> aBcDe

ABCDE -> aBcDe

abCdE -> aBcDe

我知道如何在 C 语言中制作它,但不知道 Shell 脚本。这是 C 代码。

  1 #include <stdio.h>
2 #include <ctype.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 int main(int args, char* argv[])
7 {
8
9 if(args != 2)
10 exit(1);
11 char buf[100];
12 for(int i = 0; i < strlen(argv[1]); i++)
13 {
14 if(i%2 == 0)
15 buf[i] = tolower(argv[1][i]);
16 else
17 buf[i] = toupper(argv[1][i]);
18 }
19 printf("%s\n", buf);
20 }

你们能帮我用shell脚本写吗?谢谢。

最佳答案

使用 sed,您可以重复解析 2 个字符,将第一个字符更改为小写,将第二个字符更改为大写。这看起来不错,但如果最后一个字符包含一个奇数个字符的字符串呢?
首先将最后一个字符更改为小写。这对于奇数长度的字符串是可以的,对于偶数长度的字符串将使用第二个命令进行修改:

if [ $# -ne 1 ]; then
exit 1
fi
lastcharlow=$(sed -r "s/(.)$/\l\1/" <<< "${1}")
sed -r "s/(.)(.)/\l\1\u\2/g" <<<"${lastcharlow}"

最后两行可以合并:

sed -r "s/(.)$/\l\1/; s/(.)(.)/\l\1\u\2/g" <<<"${1}"

编辑:下面的文字

sed 解决方案很好而且简短,但没有说明如何循环遍历字符串。当您真的不知道适合您的工具时,您可以遍历字符串。我将展示 3 种更改 char 大小写的方法和两个循环遍历字符串的函数。

function upper {
# tr '[:lower:]' '[:upper:]' <<< $1
# echo "${1^^}"
typeset -u up; up="$1"; echo "${up}"
}

function lower {
# tr '[:upper:]' '[:lower:]' <<< $1
# echo "${1,,}"
typeset -l low; low="$1"; echo "${low}"
}

function grepsolution {
i=0
while read -r onechar; do
(( i++ ))
if [[ $((i%2)) = 0 ]] ; then
printf "%s" $(upper "${onechar}" )
else
printf "%s" $(lower "${onechar}" )
fi
done < <(echo $1 | grep -o .)
printf "\n"
}

function substr_solution {
i=0
while [ $i -lt ${#1} ]; do
(( i++ ))
if [[ $((i%2)) = 0 ]] ; then
printf "%s" $(upper "${1:i-1:1}" )
else
printf "%s" $(lower "${1:i-1:1}" )
fi
done
printf "\n"
}

for teststring in abcde abcdef ABCDE ABCDEF; do
echo "Converting ${teststring}"
printf "%-20s: " "grepsolution"
grepsolution "${teststring}"
printf "%-20s: " "substr_solution"
substr_solution "${teststring}"
done

关于c - 如何交替交换大写和小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41211950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com