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

时间:2015-03-06 22:28:17

标签: c arrays uppercase lowercase

我试图将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);
}

为什么要打印"?"炭?

4 个答案:

答案 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;
}
  

请注意,aA之间的差异是 32 常量。