我正在努力提高我对 C++ 的理解,尤其是指针算法。我经常使用 atoi,但我很少考虑它是如何工作的。查看它是如何完成的,我大部分都明白了,但有一件事我很困惑。
下面是我在网上找到的解决方案示例:
int atoi( char* pStr )
{
int iRetVal = 0;
if ( pStr )
{
while ( *pStr && *pStr <= '9' && *pStr >= '0' )
{
iRetVal = (iRetVal * 10) + (*pStr - '0');
pStr++;
}
}
return iRetVal;
}
我认为我很难理解过去如何进行 atoi 的主要原因是比较字符的方式。 “while”语句表示当字符存在时,并且该字符小于或等于 9,并且它大于-or-equal-to 0 然后做一些事情。这句话告诉我两件事:
- 字符可以与其他字符进行逻辑比较(但返回值是多少?)。
在我研究这个之前,我想我下意识地知道它,但我从来没有真正想过,但是“5”字符比“6”字符“小”,就像 5 小于 6 一样,所以您基本上可以将字符作为整数进行比较(出于此目的)。
- 不知何故 while (*sPtr) 和 *SPtr != 0 是不同的。这对我来说似乎很明显,但我发现我无法用语言表达,这意味着我知道这是真的,但我不明白为什么。
编辑:我不知道 *pStr - '0' 部分会做什么。
任何有助于理解这些观察结果的信息都会非常……有帮助!谢谢!
最佳答案
while the character exists
不,不是真的。它说“虽然字符不是 0(或 '\0'
)。基本上,ASCII 字符 '\0'
表示“C”字符串的结尾。因为你不想超过字符数组的末尾(并且不知道确切的长度),每个字符都针对 '\0'
进行测试。
Characters can be compared to other characters logically
没错。字符只不过是一个数字,好吧,至少在 ASCII 编码中是这样。例如在ASCII中,'0'
对应十进制值48
,'1'
为49,'Z'
是 90(你可以看看 ASCII Table here )。所以是的,您可以像比较整数一样比较字符。
Somehow
while (*sPtr)
and*sPtr != 0
are different.
完全没有区别。十进制 0 是一个特殊的 ASCII 符号 (nul)
,用于指示“C”字符串的结尾,正如我在开头提到的。您看不到或打印 (nul)
,但它就在那里。
关于c++ - 了解如何创建 atoi;字符是如何比较的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14615162/