c++ - 了解如何创建 atoi;字符是如何比较的?

标签 c++ character atoi

我正在努力提高我对 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 然后做一些事情。这句话告诉我两件事:

  1. 字符可以与其他字符进行逻辑比较(但返回值是多少?)。

在我研究这个之前,我想我下意识地知道它,但我从来没有真正想过,但是“5”字符比“6”字符“小”,就像 5 小于 6 一样,所以您基本上可以将字符作为整数进行比较(出于此目的)。

  1. 不知何故 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/

相关文章:

c - 如何选择何时打印字符数组中的特定字符

c - 为什么我在 C 中使用 atoi() 会得到这个意想不到的结果?

c++ - 解析字符串并将整数值插入结构 vector C++

c++ - 如何用另一个特征向量填充一个特征向量?

c++ - 使用 Qt + Opencv 时未定义的 Opencv 引用

c++ - Visual C++ - 设置模板实例化的深度

string - 涉及随机访问字符串的重要算法?

c - 根据第一个字符对文本行进行排序 - C 编程

c++ - 为什么 atoi 函数不能将 const char * 转换为 int?

c - atoi返回的值无法打印