atoi() method, char * cout
atoi() method, char * 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
:
第一行:为什么计数是2?*
pStr
被传递作为一个指针到char
的242,不应该是242代替?
第2行:我必须注释掉这个cout
,因为它看起来像是在无限循环中。while (*pCur)
是什么意思?为什么我们需要这个循环?
第3行:为什么不打印任何东西?
第4行:为什么不打印任何东西?
第5行:为什么在递减之后现在打印出2 ?
要理解为什么会发生这种情况,您需要了解字符串在c++中的工作原理,实际上是字符数组的工作原理。字符串实际上只是一个字符数组,以一个空字符(值0,而不是数字0)结尾。我们通过指向数组中的第一个字符来传递这个字符串。当希望打印字符串时,只需打印所指向的字符,增加指针,并继续执行此操作,直到到达空字符。
第1行:你对指针解引用,它实际上是一个指向字符数组的指针。所以指针指向char的第一个元素。它看起来像这样:
char 1: 2 <-- The pointer points to this
char 2: 4
char 3: 2
char 4: (null byte)
通过在指针前加上*
,可以检索到它所指向的值,即字符2。
第2行:正如我在第1行提到的,*ptr
实际上是所指向的字符的值,因此只要ptr
所指向的字符不为0,while (*ptr)
将继续。通过增加ptr
,我们增加了指针,并在某一点到达空字节。
char 1: 2
char 2: 4
char 3: 2
char 4: (null byte) <-- After the loop, this is what we point at
第3行:这不是一个无限循环,您检查所指向的char的值,如果它不为0,则增加指针。这本质上就是你如何迭代字符串的字符。对于每次迭代,您将打印出所指向的字符(正如提交出部分所做的那样),并增加指针,直到到达空字符。
因为你已经增加了上面的指针,直到它到达空字符,它也将在循环后指向空字符。因此,当您打印ptr指针时,实际上执行了上面的循环,打印所有字符,直到到达空指针。但是在您的例子中,您已经指向空字符。
char 1: 2
char 2: 4
char 3: 2
char 4: (null byte) <-- We are still point to the null character,
so it is treated as an empty string
第4行:您尝试打印出ptr
指向的字符,但这是空字符,因此没有打印任何内容。
char 1: 2
char 2: 4
char 3: 2
char 4: (null byte) <-- We are still point to the null character so no
printing is done.
第5行:减少上面一行的指针,这意味着它指向数组中的前一个元素。所以现在你指向最后一个'2'字符,所以它被打印出来。
char 1: 2
char 2: 4
char 3: 2 <-- You decreased it by one, so now we are pointing at 2.
char 4: (null byte)
在第1行中,您将使用pCur
而不是*pCur
来输出字符串。在第一种形式中,它是一个指针指向char
,这是一个以第一个"空字节"(' '
)结束的字符串。在第二种形式中,指针所指向的内存地址被解引用,因此实际上打印的是单个字符。
在第2行,目的是在字符串结束时退出循环。方便的是,字符串在第一个"空字节"结束,它由0表示,计算结果为false。pCur++
将指针沿着字符串移动,直到找到0为止。
在第3行中,pCur
现在指向空字节,这实际上是转换为空字符串。
在第4行中,*pCur
再次对指针地址解引用,但该字符是不可打印的字符' '
,因此在输出中看不到任何内容。
在第5行中,您将指针向后移动一个空格以指向"242"的个位数,因此您将看到2
作为输出。
- 为什么strlen(s)与s的大小不同,为什么cout-char显示的是字符而不是数字
- 为什么调用 cout.operator<<(const char*) 打印地址而不是字符串? 如何创建一个函数本地静态"HashSet<char>"并初始化它一次?
- C Cout如何打印一个char*
- 使用cout,如何将char转换为变量的地址/引用(?)
- C++:带有cout和指向char的指针的无法解释的行为
- std :: cout null char*指针中止该程序
- 将字符串转换为char,当我cout时,它是正确的,但是当我将chdir与char一起使用时,它不起作用
- C 可以做想要的|char [] cout和倒置的char []
- C++。为什么 std::cout << char + int 打印 int 值?
- cout 是否保证具有 ctype<char> 刻面?
- 为什么"cout"对"unsigned char"很奇怪?
- "cout"和"char address"
- char* p=NULL, cout<<p;给出例外
- 带有 char* 参数的 cout <<打印字符串,而不是指针值
- 为什么std::cout可以打印char[]
- 我如何传递一个布尔数组或Unsigned Char*到cout
- 二进制表达式的操作数无效("std::__1::basic_ostream<char>"和"ostream"(又名"basic_ostream")) std::cout<<&l
- C++中的希伯来字符(cout<<char<<char;)
- atoi() method, char * cout II
- atoi() method, char * cout