我试图将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);
}
为什么要打印"?"炭?
答案 0 :(得分:2)
首先,不要假设您使用的是ascii字符集(即,某些字符集中的32是错误的附加值)。你遇到的问题是'h'+ 32不是小写“h”。 'h'已经是小写,所以你要加0。检查它;类似的东西:
if( tolower >= 'A' && tolower <= 'Z' )
tolower += 'a' - 'A';
答案 1 :(得分:1)
我不会指出其他回答者所遇到的问题,我会展示一个巧妙的技巧来执行交换上限。对于字母,小写字母和大写字母之间的差异是ascii代码中的第5位。因此要将字母设置为小写,您需要设置此位:
lower = 0x20 | letter;
对于大写重置位:
upper = (~0x20) & letter;
要交换案例,您可以使用XOR:
swapped = 0x20 ^ letter;
这里的好处是你不必担心,并检查这封信是否已经是你需要的。
当然,这里的假设是您的系统使用ASCII编码。
答案 2 :(得分:0)
Ascii 136不是可打印字符。您应该执行lowercase = tolower - 'A' + 'a';
之类的操作,但前提是tolower
肯定是大写(在您的示例中不是这样)。
答案 3 :(得分:0)
这是来自我自己的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 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;
}
请注意,
a
和A
之间的差异是 32 常量。