atoi()方法,char * cout

时间:2013-03-04 21:30:04

标签: c++ char infinite-loop cout

这是我想要了解的atoi()。为了使用不存在的库进行编译,我将其称为m()

我感到困惑的是几行代码,主要是char *个问题。

我的问题列在代码

之后
#include "stdafx.h"
#include <iostream>

using namespace std;

int m( char* pStr ) {   
    int iRetVal = 0;   
    int iTens = 1;   
    cout << "* pStr: " << * pStr << endl;   // line 1
    if ( pStr )  {    
        char* pCur = pStr;  
        cout << "* pCur: " << * pCur << endl;
        while (*pCur)  {     
            //cout << "* pCur: " << * pCur << endl; //line 2
            pCur++;   }
        cout << "pCur: " << pCur << endl;       //line 3
        cout << "* pCur: " << * pCur << endl;   //line 4
        pCur--;     
        cout << "pCur: " << pCur << endl;       //line 5
        while ( pCur >= pStr && *pCur <= '9' && *pCur >= '0' )     {       
            iRetVal += ((*pCur - '0') * iTens);      
            pCur--;       
            iTens *= 10;     }  }   
    return iRetVal; } 


int main(int argc, char * argv[])
{
    int i = m("242");
    cout << i << endl;
    return 0;
}

输出:

* pStr: 2
* pCur: 2
pCur:
* pCur:
pCur: 2
242

问题

  

第1行:为什么cout是2? * pStr作为指向char的指针传入242,不应该是242而不是?   第2行:我必须注释掉这个cout,因为它看起来像是无限循环。while (*pCur)是什么意思?为什么我们需要这个循环呢?   第3行:为什么不打印任何内容?
  第4行:为什么不打印任何内容?
  第5行:为什么它在减少后立即打印出2?

2 个答案:

答案 0 :(得分:3)

要理解为什么会发生这种情况,你需要了解字符串在C ++中是如何工作的,实际上,字符数组是如何工作的。字符串实际上只是一个字符数组,以空字符结尾(值0,而不是数字0)。我们通过指向数组中的第一个字符来传递此字符串。当我们希望打印字符串时,我们只需打印指向的字符,增加指针,然后继续,直到我们到达空字符。

第1行:您取消引用指针,它实际上是指向字符数组的指针。所以指针指向第一个char。它看起来像这样:

char 1: 2 <-- The pointer points to this  
char 2: 4  
char 3: 2  
char 4: \0 (null byte)

通过在*前面添加指针,可以检索它指向的值,即字符2。

第2行:正如我在第1行中所提到的,*ptr实际上是指向的字符的值,因此只要字符指向while (*ptr)ptr就会继续by ptr不是0.通过增加char 1: 2 char 2: 4 char 3: 2 char 4: \0 (null byte) <-- After the loop, this is what we point at ,我们增加指针,并在某个时刻到达空字节。

char 1: 2
char 2: 4  
char 3: 2  
char 4: \0 (null byte) <-- We are still point to the null character, 
                           so it is treated as an empty string

第3行:这不是一个无限循环,你检查指向的char的值,如果它不是0,你增加指针。这实质上就是你如何迭代字符串的字符。对于每次迭代,您将打印出指向的字符(当您输出部分时),并增加指针,直到您到达空字符。

由于你已经将指针增加到上面,直到它到达空字符,它也将指向循环后的空字符。所以当你打印ptr指针时,你真的执行上面的循环,打印所有字符,直到你到达空指针。但在你的情况下,你已经指出了空字符。

ptr

第4行:您尝试打印char 1: 2 char 2: 4 char 3: 2 char 4: \0 (null byte) <-- We are still point to the null character so no printing is done. 指向的字符,但这是空字符,因此不打印任何内容。

char 1: 2
char 2: 4  
char 3: 2  <-- You decreased it by one, so now we are pointing at 2.
char 4: \0 (null byte)

第5行:减少上面一行的指针,意味着它指向数组中的上一个元素。所以你现在指向最后一个'2'字符,所以它被打印出来。

{{1}}

答案 1 :(得分:1)

在第1行中,您将使用pCur而不是*pCur来输出字符串。在第一种形式中,它是{em>指针到char,它被视为一个以第一个&#34;空字节结束的字符串&#34; ('\0')。在第二种形式中,指针指向的内存地址被解除引用,因此您实际上是在打印单个字符。

在第2行中,目的是退出字符串末尾的循环。方便地,字符串在第一个&#34;空字节&#34;处结束,其由0表示,其评估为假。 pCur++沿着字符串移动指针,直到找到0。

在第3行中,pCur现在指向空字节,它实际上转换为空字符串。

在第4行中,*pCur再次取消引用指针地址 - 但该字符是不可打印的字符'\0',因此您不会在输出中看到任何内容。

在第5行中,您将指针移回一个空格 - 指向&#34; 242&#34;的个位数,因此您将2视为输出。