【问题标题】:In Programming Code to Convert Lowercase to Uppercase why do we use(str[i]>=97 && str[i]<=122)?在将小写转换为大写的编程代码中,为什么我们使用(str[i]>=97 && str[i]<=122)?
【发布时间】:2017-01-31 14:48:35
【问题描述】:

所以这是我用来将小写转换为大写的程序,你能告诉我为什么我们使用这个东西吗?[(str[i]>=97 && str[i]

#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();
}

【问题讨论】:

  • ASCII table 可能会对您有所帮助。
  • 请不要从这个程序中学到任何东西,因为它很糟糕。它使用应该避免的magic numbers。不使用完美的std::toupper 函数。它依赖于 ASCII 编码,因此不可移植。而且不使用std::string,容易出现缓冲区溢出。
  • 另外,#include&lt;string.h&gt; 自 90 年代以来已被弃用,#include&lt;iostream.h&gt; 以及 void main 从来都不是合法的标准 C++。你应该得到更好和更新的代码来学习。
  • if(str[i]>=97 && str[i] 通常我们用(如果我们真的需要它,在现代 C++ 中很少出现这种情况)if(str[i]&gt;='a' &amp;&amp; str[i]&lt;='z'),因为它更具可读性。
  • @Veritasian 我看不出这怎么可能。你有没有使用双引号 (") 而不是单引号 (')?

标签: c++ string lowercase toupper


【解决方案1】:

这部分代码写得很烂:

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 库宏/函数(来自 &lt;ctype.h&gt;):

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

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

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

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

【讨论】:

  • 最好直接说str[i] = toupper((unsigned char)str[i])
  • @JohnZwinck:是的,谢谢,仍在努力完善答案... ;-)
  • 当然是“更具可读性”。 “更便携”是的,但仍然不完全,因为不能保证 'a''z' 具有连续的数字表示。
  • toupper() 不强制转换为 unsigned char 如果遇到“负”字符,可能会导致未定义的行为。
【解决方案2】:

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

所以如果你的字符(只是一个字节)在这个区间内,它就是一个小写字母。减去 32 将使其变为大写。

请注意,在这种情况下,str[i] &lt;= 122str[i] &lt;= 'z' 是等效的。

【讨论】:

  • @axiac:你最后一次检查是什么时候?他们可能已经改变了它。
  • @BenjaminLindley 5 分钟前 :-)
  • “请注意,在 C 中,str[i] - 不,它们不是。 'z' 可能是也可能不是 122。实际上,您可能永远不会遇到不是 122 的系统,但不能保证。见stackoverflow.com/a/29381142/3313064
【解决方案3】:

这将是更合适的代码:

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

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

【讨论】:

    【解决方案4】:

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

    但是,一般来说,假设每个系统都使用 ASCII 是不好的。还有其他字符集。您应该使用标头 &lt;cctype&gt; 中的库函数 touppertolower

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2023-03-19
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多