这是我想了解的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行中,您将使用pCur
而非*pCur
输出字符串。在第一种形式中,它是指向char
的指针,该指针被视为以第一个“空字节”('\0'
)结尾的字符串。在第二种形式中,指针所指向的内存地址已被取消引用,因此您实际上是在打印单个字符。
在第2行中,目的是在字符串末尾退出循环。方便地,字符串以第一个“空字节”结尾,该字节由0表示,其值为false。 pCur++
沿着字符串移动指针,直到找到0。
在第3行中,pCur
现在指向空字节,该字节实际上转换为空字符串。
在第4行中,*pCur
再次取消引用指针地址,但是该字符是不可打印的字符'\0'
,因此您在输出中看不到任何内容。
在第5行中,您将指针向后移了一个空格,以指向“242”的一位,因此您将2
视为输出。