尝试在不使用函数的情况下将C中的大写字符转换为小写字母

我试图将char * argv []数组中的char元素从大写转换为小写而不使用函数。 我想在ascii整数中添加32。

当我尝试将变量作为参数传递时,它将显示整数和,但不显示新的小写字符。 相反,它显示以下输出:

letter h, 104 tolower: 136,   

码:

 int i = 0; for(i = 0; argv[1][i] != '\0'; i++) { char letter = argv[1][i]; printf("letter %c, %i\n", letter, letter); char tolower = argv[1][i]; int lowercase = tolower + 32; printf("tolower: %i, %c\n", lowercase, lowercase); } 

为什么要打印“?” 炭?

首先,不要假设您使用的是ascii字符集(即,某些字符集中的32是错误的附加值)。 你遇到的问题是’h’+ 32不是小写“h”。 ‘h’已经是小写的,所以你要添加0.检查它; 就像是:

 if( tolower >= 'A' && tolower <= 'Z' ) tolower += 'a' - 'A'; 

我不会指出其他回答者所做的问题,我会展示一个巧妙的技巧来执行交换上下。 对于字母,小写字母和大写字母之间的差异是ascii代码中的第5位。 因此要将字母设置为小写,您需要设置此位:

 lower = 0x20 | letter; 

对于大写重置位:

 upper = (~0x20) & letter; 

要交换案例,您可以使用XOR:

 swapped = 0x20 ^ letter; 

这里的好处是你不必担心并检查这封信是否已经是你需要的。

当然,这里的假设是您的系统使用ASCII编码。

Ascii 136不是可打印的字符。 你应该做一些像lowercase = tolower - 'A' + 'a'; ,但只有当tolower肯定是大写时(它不在你的例子中)。

这来自我自己的C ++库,但它也适用于C语言库。

自我优化(库函数)

 // return the specified letter in lowercase char tolower(int c) { // (int)a = 97, (int)A = 65 // (a)97 - (A)65 = 32 // therefore 32 + 65 = a return c > 64 && c < 91 ? c + 32 : c; } // return the specfied letter in uppercase char toupper(int c) { // (int)a = 97, (int)A = 65 // (a)97 - (A)65 = 32 // therefore 97 - 32 = A return c > 96 && c < 123 ? c - 32 : c; } 

返回值是可打印的char 。 但是,如果您要按照以下方式执行,一些现代编译器可能已经优化了代码。

可读

 char tolower(int c) { return c >= 'A' && c <= 'Z' ? c + ('a' - 'A') : c; } char toupper(int c) { return c >= 'a' && c <= 'z' ? c - ('a' - 'A') : c; } 

注意, aA之间的差值是32常数。