- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了在 main 函数中迭代 C 风格字符串数组的示例代码,代码工作正常,看起来像这样:
int _tmain(int argc, TCHAR* argv[])
{
for (TCHAR **iList = argv; *iList != NULL; ++iList)
{
wcout << *iList << endl;
}
cin.get();
return 0;
}
有一部分没看懂:
*iList != NULL
也许有人可以向我解释这部分?
最佳答案
C 风格字符串也称为空终止字符串。这只是意味着您将实际字符串的字符放在内存中,然后在所有这些字符之后,您就有了空字符。因此,当您想遍历 C 风格字符串中的所有字符时,您只需要从头开始,一直进行直到遇到空字符。
但是,在这个特定示例中,您处理的是一个字符串数组,而不仅仅是一个字符串。这意味着 argv
实际上指向内存中的一个位置,该位置是指针列表的开头。该列表中的每个指针都指向一个 C 风格的字符串。在这个指针数组的末尾,你有一个 NULL
指针,所以一旦你到达它,你就迭代了 argv
中的所有字符串。
让我们逐行看一下:
for (TCHAR **iList = argv; *iList != NULL; ++iList)
好吧,那太复杂了。我们先看第一个表达式:
TCHAR **iList = argv;
这声明了一个类型为 TCHAR**
的变量 iList
。这意味着它是一个指向 TCHAR
的指针。它的值指向指针的位置,然后该指针指向 C 风格字符串的开头位置。
*iList != NULL;
这会获取 iList
指向的东西,并查看它是否是一个 NULL
指针。请记住 iList
指向指针,因此目标是继续检查 iList
指向的指针,直到找到一个实际上不指向任何东西的指针(这就是 NULL
表示),然后停止。
++iList
这只是意味着,每次执行 for
循环体时,您都会将 iList
的值加 1。因为 iList
是指向指针的指针,所以我们告诉 iList
指向它之前指向的指针之后的指针。
最后:
wcout << *iList << endl;
意思是把iList
指向的东西(一个指针,因为iList
指向指针)插入到wcout
中,后跟一个换行符。这种情况下的插入运算符很聪明:因为 iList
指向的东西是一个指向字符的指针,它知道将它解释为 C 风格的字符串,所以跟随它指向的字符iList
指向的指针(是的,混淆),直到它找到一个空字符,并将所有这些字符打印到屏幕上。 endl
充当换行符和刷新 wcout
缓冲区的信号(将其直接打印到屏幕上,而不是仅将其保存在内存中)。
关于c++ - 如何在 C 和 C++ 中迭代字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31088789/
我是一名优秀的程序员,十分优秀!