首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >atoi()方法,char * cout

atoi()方法,char * cout
EN

Stack Overflow用户
提问于 2013-03-04 21:30:03
回答 2查看 339关注 0票数 1

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

有几行代码我很困惑,主要是char *问题。

我的问题列在代码之后。

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
* pStr: 2
* pCur: 2
pCur:
* pCur:
pCur: 2
242

问题

第1行:为什么cout是2?* pStr作为char的指针传入242,不是应该是242吗? 第2行:,我不得不注释掉这个cout,因为它看起来像是在无限loop.What中,while (*pCur)是什么意思?为什么我们需要这个循环? 第3行:为什么不打印任何东西? 第4行:为什么不打印任何东西? 第5行:为什么在它减少之后现在打印出2呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-04 21:43:28

在第1行中,您将使用pCur而不是*pCur输出字符串。在第一种形式中,它是指向char的指针,该指针被视为以第一个“空字节”('\0')结尾的字符串。在第二种形式中,指针所指向的内存地址被取消引用,因此实际上是打印单个字符。

在第2行中,目的是在字符串末尾退出循环。方便地,字符串以第一个“空字节”结尾,该字节由0表示,其计算结果为false。pCur++沿着字符串移动指针,直到找到0为止。

在第3行中,pCur现在指向空字节,该字节实质上是一个空字符串。

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

在第5行中,您将指针移回一个空格,指向"242“的数字,因此您将2视为输出。

票数 1
EN

Stack Overflow用户

发布于 2013-03-04 21:34:45

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

第1行:取消对指针的引用,它实际上是一个指向字符数组的指针。因此指针指向第一个字符。看起来是这样的:

代码语言:javascript
复制
char 1: 2 <-- The pointer points to this  
char 2: 4  
char 3: 2  
char 4: \0 (null byte)

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

第2行:正如我在第1行中提到的,*ptr实际上是指向的字符的值,所以只要ptr指向的字符不是0,while (*ptr)就会继续。通过增加ptr,我们增加指针,并在某个点达到空字节。

代码语言:javascript
复制
char 1: 2
char 2: 4  
char 3: 2  
char 4: \0 (null byte) <-- After the loop, this is what we point at

第3行:这不是一个无限循环,检查所指向的字符的值,如果不是0,则增加指针。本质上,这就是迭代字符串字符的方法。对于每一次迭代,您都会打印出所指向的字符(正如您注释掉的部分所做的那样),并增加指针,直到达到空字符为止。

由于您增加了上面的指针,直到它到达空字符,它也将指向循环后的空字符。因此,当您打印ptr指针时,您确实会执行上面的循环,打印所有字符直到达到空指针为止。但在您的情况下,您已经指向空字符。

代码语言:javascript
复制
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

第4行:您尝试打印出ptr指向的字符,但这是空字符,因此没有打印任何字符。

代码语言:javascript
复制
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.

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

代码语言:javascript
复制
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)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15211507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档