为什么使用for循环时c-string长度很重要?终止字符'\ 0'是否存在问题?
以下代码将for循环发送到崩溃编译器的疯狂循环中:
#include <iostream>
#include<cstring>
using namespace std;
int main()
{
char c[] = "charac";
int i;
for (i=0; i < 8 ; i++)
{
cout << c[i] << endl;
}
return 0;
}
通过在我的c-string中添加't',代码运行得很好:
char c[] = "charact";
int i;
for (i=0; i < 8 ; i++)
{
cout << c[i] << endl;
}
答案 0 :(得分:2)
在您的第一个版本中,没有字符c[7]
。数组中有7个字符,6个字符串和1个空终止符:
Array: c h a r a c \0
Indices: 0 1 2 3 4 5 6
尝试访问除此之外的任何内容都是未定义的行为。
在你的第二个版本中,假设你运行的代码有t
你忘了放入发布版本,那么数组有8个字符,循环保持在数组的范围内。
答案 1 :(得分:1)
你有一个长度为7的字符串(6 + null终止符),并且正在尝试访问第8个元素。这将导致未定义的行为。
答案 2 :(得分:1)
我认为你已经超越了角色阵列的末尾。通过添加额外字符,您的字符串现在长度为7个字符,因此i&lt; 8测试可以正常工作。
答案 3 :(得分:1)
您是数组末尾的索引。 C开始索引为零,因此六个字符串的最后一个索引是五。如果你包含null终止符,那么你有6个,但是你正在访问第七个数组位置。
答案 4 :(得分:0)
c [7]对于“charac”不存在,因为c [6]是空终止字符。但是当你把它改成“charact”时,c [7]就会变成空终止字符,所以运行正常。