【问题标题】:Check if a letter is before or after another letter in C检查一个字母是在 C 中的另一个字母之前还是之后
【发布时间】:2016-10-07 03:14:24
【问题描述】:

我想检查一个字符串的第一个字母是在字母表中t之前还是之后。

例如,用户输入“Brad”,它会打印出来

"Your name starts with a letter that comes before "t"."

类似的东西。

【问题讨论】:

  • 如果您的输入在变量 In 中,您可以像这样检查它if (In[0] < 't')
  • 提示:记住字符实际上是数字,例如首都 A,'A' 是 0x41。考虑到这一点,请查看 ASCII 字符表(请参阅asciitable.com),看看您是否想不出一种方法来确定“B”(0x42)在 t(0x74)之前。
  • 但要注意可以有大写和小写。为此,只需在比较之前将所有内容转换为上限或下限
  • 不保证字母有相邻的代码甚至按字母顺序排列。这取决于您的执行字符集。

标签: c


【解决方案1】:

如果你的字符串是:

char str[10] = "Brad"

你可以比较一下:

if (str[0]) < 't') {
    ...

如果 'B' 在 ASCII 字符集中的字符 't' 之前,它将评估为 1 (true)。请注意,此比较区分大小写,因此您希望将要比较的字符转换为相同的大小写以使其有意义。您可以使用 ctype.h 库中的 toupper()tolower() 函数来完成此操作。 C 将chars 视为整数类型,因此您可以对它们进行数学运算。

大多数关于 C 的介绍性文本都以相同的方式解决了这个问题,但正如 @Olaf 指出的那样,该标准不保证哪些值代表特定字符。因此,当便携性成为一个问题时,您需要更加小心。也就是说,大多数系统使用 ASCII 或 UTF-8,后者是 ASCII 的超集(前 128 个字符相同),这使得这个简单的解决方案成为一个合理的起点。

【讨论】:

  • 不保证字母有相邻的代码甚至按字母顺序排列。这取决于您的执行字符集。
  • @Olaf,我不确定为什么这些答案值得反对。我认为他们是在感知问题的层面上提出的。不过,您的观点是正确的——我已经更新了我的答案,以解决您对可移植性的担忧。
  • 好吧,我删除了 DV。请理解,有时批评 DV 并不容易。如果有评论,只需编辑并向评论者发表评论即可。注意:不需要对 DV 发表评论。我倾向于这样做,只是因为我希望推动海报以增强帖子。你做了什么。
  • @Olaf——注意到了。感谢 cmets,他们确实激发了我对此事的进一步研究。
【解决方案2】:

类似下面的内容(添加对 null 的检查,如果它的第一个字符是 t 本身,等等)。

#include <stdio.h>
#include <stdlib.h>

/* t's value in ASCII */
#define LETTER_T 116

int main(int argc, char * argv[])
{
      /* Use toupper or tolower functions to handle casing */
      char * str = "brad"; 
      char * result = (str[0] < LETTER_T) ? "before" : "after";
      printf("%s starts with a %c that comes %s the letter t.", str, str[0], result);
      return 0;
}

【讨论】:

  • 不保证字母有相邻的代码甚至按字母顺序排列。这取决于您的执行字符集。
  • @Olaf 这只是一个简单的示例,而不是考虑到与 ASCII 不同的字符集(即 Unicode、UTF-8 等)的稳健解决方案。答案甚至可以用“类似下面的东西”来限定。
  • 这甚至并不意味着解决方案可以完全关闭(例如 EBCDIC)。顺便提一句。使用幻数是不行的。有什么理由不使用整数't'
猜你喜欢
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多