如何在 C 语言中获取字符在字母表中的位置?
Posted
技术标签:
【中文标题】如何在 C 语言中获取字符在字母表中的位置?【英文标题】:How to get character's position in alphabet in C language? 【发布时间】:2010-12-09 15:46:48 【问题描述】:有没有一种快速的方法来检索给定字符在 C 中英文字母表中的位置?
类似:
int position = get_position('g');
【问题讨论】:
【参考方案1】:int position = 'g' - 'a' + 1;
在 C 中,char
值可转换为 int
值并采用其 ASCII 值。在这种情况下,'a'
与 97 相同,'g'
为 103。由于字母在 ASCII 字符集中是连续的,因此从您的值中减去 'a'
即可得出其相对位置。如果您认为'a'
是第一个(而不是第零个)位置,则添加 1。
【讨论】:
请注意,ASCII 不是 C 标准的一部分。它几乎无处不在,足以在您几乎可以找到的任何系统上工作。该标准保证数字在字符集中是连续的,但不是字母表(如果是 EBCDIC,这会让您感到困惑,但说真的,谁再关心 EBCDIC 了?)。 我爸爸还在 COBOL 中使用 EBCDIC。他维护波音的东西。 -_- 所以 A 是字母表中的第 -31 个字母? 如何以相反的顺序打印字母数字,例如.. 1 代表 z,2 代表 y 等等。【参考方案2】:您还应该考虑大写/小写。根据我的经验,从 1 开始计数通常很危险,因为它可能导致错误的错误。根据经验,我总是仅在与用户交互时才转换为从 1 开始的索引,并在内部使用从 0 开始的计数,以避免混淆。
int GetPosition(char c)
if (c >= 'a' && c <= 'z')
return c - 'a';
else if (c >= 'A' && c <= 'Z')
return c - 'A';
else
// Indicate that it isn't a letter.
return -1;
【讨论】:
您可以通过在ctype.h
标头中使用tolower()
或toupper()
来简化它,这样您就不必同时检查大小写。
我很欣赏这个答案,因为它考虑了案例。众所周知,在许多逻辑上下文中,“A”与“a”非常不同。【参考方案3】:
这将适用于 EBCDIC 并且不区分大小写:
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int getpos (char c)
int pos;
const char * alphabet = "abcdefghijklmnopqrstuvwxyz";
const char * found;
c = tolower ((unsigned char)c);
found = strchr (alphabet, c);
pos = found - alphabet;
if (!found)
pos = 0;
else if (pos == 26)
pos = 0;
else
pos++;
return pos;
int main ()
char tests[] = 'A', '%', 'a', 'z', 'M', 0;
char * c;
for (c = tests; *c; c++)
printf ("%d\n", *c - 'a' + 1);
printf ("%d\n", getpos (*c));
return 0;
如果你想运行它,请参阅http://codepad.org/5u5uO5ZR。
【讨论】:
【参考方案4】:输入字母表:
scanf("%c",ch);
只需从字符的 ascii 值中减去 96。这可以在 printf 参数中完成:
printf("%d",ch-96);
【讨论】:
以上是关于如何在 C 语言中获取字符在字母表中的位置?的主要内容,如果未能解决你的问题,请参考以下文章