如何在C和C++中迭代字符串数组
How do I iterate over a string array in C and C++?
我发现了在主函数内迭代C风格字符串数组的示例代码,代码运行良好,如下所示:
int _tmain(int argc, TCHAR* argv[])
{
for (TCHAR **iList = argv; *iList != NULL; ++iList)
{
wcout << *iList << endl;
}
cin.get();
return 0;
}
有一部分我不明白:
*iList != NULL
也许有人能给我解释一下这个部分?
C样式字符串也称为以null结尾的字符串。这只是意味着你将实际字符串的字符放在内存中,然后在所有这些字符之后,你就有了null字符。因此,当你想迭代C风格字符串中的所有字符时,你只需要从头开始,一直到达到一个null字符。
然而,在这个特定的示例中,您处理的是字符串的数组,而不仅仅是单个字符串。这意味着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
所指向的指针所指向的字符(yay,混淆),直到它找到一个空字符,并将所有这些字符打印到屏幕上。endl
同时充当换行符和刷新wcout
缓冲区的信号(将其直接打印到屏幕上,而不仅仅是将其保存在内存中)。
将其分解为最简单的形式;想想二维阵列,
[0,0][0,1][0,2][0,3][0,4][0,5]
[1,0][1,1][1,2][1,3][1,4][1,5]
[2,0][2,1][2,2][2,3][2,4][2,5]
[3,0][3,1][3,2][3,3][3,4][3,5]
[4,0][4,1][4,2][4,3][4,4][4,5]
[5,0][5,1][5,2][5,3][5,4][5,5]
空
每个元素都是表示单个字符的TCHAR元素,每一行都是一个字符串(字符数组是一个串),最后一个元素以"\0"(NULL终止符)开头
**ilist = argv
表示矩阵第一个元素的ilist点,即[0,0]
*ilist
表示完整的行,因此使用cout打印它将打印出该行中包含的字符串
++ilist
增加指向下一行第一个元素的指针(因此增加一次将使ilist指向[1,0])
ilist != NULL
检查我们是否已经到达矩阵的末尾,因此循环执行,直到还没有到达矩阵的结尾,最后一行(第5行之后的一行,包含NULL,从而传递数组的末尾)
(内存中的实际数组表示与上面的不同,它几乎相似,一行中元素的数量根据字符串长度而变化,例如,假设参数为:"This is a string",它可以表示为:
[0]->[T] [h] [i] [s] [ ]
[1]->[i] [s] [ ]
[2]->[a] [ ]
[3]->[s] [t] [r] [i] [n] [g] [ ]
[4]->NULL
记住' '
是null终止符,它用于告诉这是字符串的末尾)
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 迭代字符串集时没有可行的转换
- C++类字符串类型的迭代器
- 使用迭代器 C++ 删除矢量中的重叠字符串
- std::move(key) 同时迭代unordered_map<字符串,字符串>?
- 对于C字符串,是否有一个标准的C++迭代器
- 在for循环的某些迭代中,字符串的长度为0,而在其他迭代中则不为0
- Map中的(字符串的)向量迭代器
- 使用迭代从链表向后打印字符串
- std::string::find 为取消引用的迭代器和等效字符串文本返回不同的值
- 字符串迭代器永远不会达到 std::string::end()
- 如何在不迭代的情况下从string_view向量创建字符串向量?
- 字符串::是否替换了迭代器和引用?
- 如何迭代字符串向量的向量?(C )
- 迭代字符串 c++ 的错误
- 错误:具有索引或迭代字符串的"<"标记之前的预期初始值设定项
- 如何迭代C++字符串向量
- 当迭代字符串时,Stringstream不起作用
- 如何在C和C++中迭代字符串数组