代码之家  ›  专栏  ›  技术社区  ›  Flavius

小写到大写

  •  4
  • Flavius  · 技术社区  · 14 年前

    我不是要求解决我的作业,只是一些提示。

    谢谢

    9 回复  |  直到 12 年前
        1
  •  14
  •   schnaader    14 年前

    正如您所说的“(不允许-32)”,我想您知道小写字符和大写字符之间的区别是32。现在把32转换成它的二进制表示,只有一个位集。在那之后,找出一种使用 bit mask 换位子。

        2
  •  4
  •   KevinDTimm    14 年前

    考虑大小写(0x20)之间的差异,然后对值应用适当的掩码

        3
  •  3
  •   wnoise    14 年前

    对于实际的代码,您应该是库函数,例如ToupPiver()或TooUpServer(),或者能够处理Unicode复杂度的东西。

        4
  •  2
  •   Å imon Tóth    14 年前

    +-32 变成一个小动作。 32 可以写成 2^x

        5
  •  1
  •   A_User    11 年前

    本例假设字符串是ASCII格式的,并使用英文字母表。

    这是C99 C代码,编译时应该使用正确的编译器标志来设置它。我特别尝试在这个例子中不使用任何libs,不管是否标准,因为我猜您仍然在学习C编程的基础知识。

    #define UPPER_CASE_SWITCH 0x5f
    void makeUpper(unsigned char *string, int length)
    {
        for(char c; length != 0 && (c=*string) != 0; --length) 
            *string++ = (((c >= 'a' && c <= 'z')) ? (c & UPPER_CASE_SWITCH) : c);
    }
    

    它利用了这样一个事实:ASCII表中大写字符和小写字符之间的唯一区别是一个位。特别是第6位(从右边)。我们要做的就是创建一个“掩码”,其中包含除第6位(从右边)以外的所有1,然后使用二进制和指令(&)将此掩码应用于我们的字符。然后把这个放进我们的绳子里。

    下面是一个python示例。

    >>> bin(ord("a")) ## Gets the binary digit for the letter "a"
    '0b1100001'
    >>> bin(ord("A")) ## Gets the binary digit for the letter "A"
    '0b1000001'
    >>> hex(0b1011111) ## Gets the hexadecimal mask we are using in the C source
    '0x5f'
    

    在我看来,这是在c中创建一个ASCII字符串(或单个ASCII字符)大写的最好方法。当然,除非您希望返回一个新字符串,即您希望创建“旧”字符串的大写版本,但仍然能够将原始版本保留在某个地方。如果你理解我的第一个例子,这应该不难做到。只需分配一个新数组来放入大写字符串,并返回指向该数组的指针(无符号字符*)。

        6
  •  0
  •   semaj    14 年前

        7
  •  0
  •   Seva Alekseyev    14 年前

    从拉丁字母的ASCII码中减去32的操作将第5位从1翻转到0。

        8
  •  0
  •   Jens Gustedt    14 年前

    正如你所说,你的家庭作业没有很好的定义。C标准对源或执行字符集的特定编码一无所知,特别是它不假定任何接近ASCII的内容。

    所以wnoise是对的 处理这些问题的标准方法是为这种效果提供的预定义函数和宏。

        9
  •  -1
  •   Steed    14 年前

    尝试使用0xDF(十六进制)或011011111二进制