1

所以这是我用来将小写转换为大写的程序,你能告诉我为什么我们在下面的代码部分中使用这个东西吗?[(str[i]>=97 && str[i]<=122)]?

#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()
{
    clrscr();
    char str[20];
    int i;
    cout << "Enter the String (Enter First Name) : ";
    cin >> str;
    for (i = 0; i <= strlen(str); i++) {
        if (str[i] >= 97 && str[i] <= 122) //Why do we use this???
        {
            str[i] = str[i] - 32;
        }
    }
    cout << "\nThe String in Uppercase = " << str;
    getch();
}
4

5 回答 5

7

这部分代码写得很糟糕:

if(str[i]>=97 && str[i]<=122)
{
 str[i]=str[i]-32;
}

它会更便携,更易读,因为:

if(str[i]>='a' && str[i]<='z')
{
 str[i]=str[i]-'a'+'A';
}

或者更好的是,使用标准 C 库宏/函数(来自<ctype.h>):

if(islower(str[i]))
{
 str[i]=toupper((unsigned char)str[i]);
}

甚至更好的是,您可以完全跳过测试并编写:

str[i]=toupper((unsigned char)str[i]);

(因为toupper如果它不是小写字母,它将原样返回 char)。

于 2017-01-31T14:53:15.990 回答
3

97 是 ascii 字符的十进制表示a,而 122 是z.

因此,如果您的字符(只是一个字节)在此间隔内,则它是一个小写字母。减去 32 将使其变为大写。

请注意,在这种情况下,写作str[i] <= 122或是str[i] <= 'z'等价的。

ASCII表

于 2017-01-31T14:51:06.127 回答
2

这将是更合适的代码:

if(str[i]>='a' && str[i]<='z')
 {
 str[i]=str[i] + 'A' - 'a';
 }
}

没有数字,如果一个字母在小写“a”和小写“z”之间,它会被“A”和“a”之间的差异转置,因此成为它的大写版本。

于 2017-01-31T14:53:36.717 回答
2

这是 ASCII 特有的,其中小写字母的数值为 97-122。这具有有用的属性,即大写字符(从 65-90 映射)可以通过常量减法或按位运算(反之亦然)转换为小写。

但是,一般来说,假设每个系统都使用 ASCII 是不好的。还有其他字符集。您应该使用库函数touppertolower从 header<cctype>中。

于 2017-01-31T14:55:37.623 回答
1

因为那是ASCII 中小写字符的范围。

于 2017-01-31T14:51:26.290 回答