我目前正在做一个项目,我需要创建两个用于包含字符串的数据结构。其中一个必须是链表的一种形式,我已经被要求将单词分隔成单独的字母表中的单独列表。我需要考虑效率,所以我有一个大小为26的Head指针数组,我想将给定的单词的第一个字符转换为整数,所以我可以把它放到下标中,例如:
//a string called s is passed as a parameter to the function
int i = /*some magic happens here*/ s.substr(0, 1);
currentPointer = heads[i]; //then I start iterating through the list
我一直在寻找,我似乎已经找到的是如何将字符串中的数字字符转换为整数,而不是字母字符,并且我想知道如何在不借助于一套巨大而丑陋的if语句
答案 0 :(得分:3)
我认为你将值与表示混淆。 “十”“10”和“1 1 1 1 1 1 1 1 1 1”都是相同的值,只是表示不同。
我一直在寻找,我似乎找到的就是如何将字符串中的数字字符转换为整数,而不是字母
没有区别。无论如何,字符总是由整数表示。这只是一个代表问题。只需按照您想要的方式呈现价值。
顺便说一句,这是程序员必须了解的关键概念。因此值得花一些时间思考它。这种误解的一个典型例子是“我有一个变量i
,它有一些十进制值。我怎样才能让它以十六进制存储一个值?”当然这没有意义,它存储值,十六进制和十进制是表示。如果您有十辆汽车,那么汽车中有十辆汽车,而不是十进制或十六进制。如果i
的值为10,则值十位于i
,而不是十进制或十六进制的十位表示。
当然,当您显示存储在i
中的值时,您必须选择如何表示。您可以将其显示为ten
,10
,| | | | | | | | | | |
或其他任何内容。
你可能有一个字符串,其中值“十”的表示十六进制,你可能需要指定值变量。这需要从表示转换为它所代表的值。
有各种表示输入和输出值的输入和输出功能。
答案 1 :(得分:2)
当您将i设置为第一个字符的值时,您将获得ASCII值。 所以我超出你的0-25范围:见男子ascii 您可以通过减去第一个alaphabet ascii字母来减少它。 (完全注意案例)
std::string s("zoro");
int i = s[0];
std::cout << "Ascii value : " << i << " Reduced : " << i - 'a' << std::endl;
如预期的那样产生ASCII值'z'= 112和25为减少的值。
答案 2 :(得分:1)
我怀疑你想将存储在字符串中的数字作为字符转换为整数,例如字符'9'
到整数9
。
为此:
char c = '9';
int x = c - '0';
无论您使用的是使用ASCII还是使用EBCDIC的计算机,都可以使用
答案 3 :(得分:0)
在这种情况下,您似乎不需要atoi
或itoa
(也不会对J
)做任何非常有用的事情。你只想要这样的东西:
int i = tolower(s[0])-'a';
理论上说这是不可移植的 - 如果在使用EBCDIC的机器上使用代码的任何机会(即IBM或兼容的大型机),你会想要使用'z'-'a'
这样的大小您的数组,因为它不会完全是26(EBCDIC包括在某些字母之间插入的一些其他字符,所以字母按顺序但不连续)。
可能更重要的是,如果你想支持英语之外的其他语言,事情就会匆忙改变 - 你可能会有不同数量的字母而不是26,它们可能并非都是连续的等等。对于这种情况你的基本设计确实是问题所在。而不是修复那一行代码,你可能需要几乎完全重新设计。
但是,顺便说一句,链接列表在这里不是一个很好的选择。