C语言 检测字符串是否包含大写字母,如果包含,则将其转换为小写字母的函数



如果整个字符串仅由大写字母组成,则下面的函数可以正常工作,但对于包含其他字符的字符串则不行,例如" a man, a plan, a canal: Panama"。在这种情况下,每个元素都被改变了。

void UppercaseToLowercase(char arr[], int size)
{
for (int i = 0; i < size - 1; i++) // i < size - 1 since last element is ''
{
if (65 <= arr[i] <= 90) // ASCII values for uppercase letters
arr[i] += 32; // ASCII values for lowercase letters
}
}

如何纠正?

65 <= arr[i] <= 90不测试arr[i]是否在65到90之间。其语法结构为(65 <= arr[i]) <= 90。这意味着计算第一个65 <= arr[i]。如果为true,则结果值为1。如果为false,则结果值为0。然后将结果0或1与90进行比较,就像0 <= 901 <= 90一样。这两个都为真,所以结果总是为真。

测试应该写成65 <= arr[i] && arr[i] <= 90。它的语法结构是(65 <= arr[i]) && (arr[i] <= 90)。每个比较分别评估,然后将其结果与&&合并。

另外,应该使用字符常量而不是数字常量。这个测试可以写成'A' <= arr[i] && arr[i] <= Z',这使得它的意图和意义更清晰。类似地,arr[i] += 32应该写成arr[i] += 'a' - 'A'。然后,该代码将适用于任何字符集,其中大写字母的代码从"A"到"Z"是连续的,小写字母的代码也是连续的。

有些字符集不是连续的,这样的代码不应该用于完全的可移植支持。我猜这是学校的练习,如果是这样的话也没关系。但是,完全可移植的代码应该使用<ctype.h>中声明的isuppertolower函数。

您遇到的问题是在您的if语句的逻辑。而不是

if (65 <= arr[i] <= 90)

对于像这样的多个条件,一个合适的逻辑测试需要包含&&结合。对于您要测试的内容,比较测试将如下所示。

if (65 <= arr[i] && arr[i] <= 90) // ASCII values for uppercase letters

用"Panama"下面是为调用您的函数而构建的测试程序的结果。

@Dev:~/C_Programs/Console/CaseCheck/bin/Release$ ./CaseCheck 
Enter a word: Panama
Before: Panama
After: panama

从这个问题中得出的结论是要认识到开发具有多个条件的测试的逻辑,这些条件可能需要&&(and)连词或|| (or)连词

试一试,看看它是否符合你的项目精神。

最新更新