C字符串无限For循环的小C[]

C String Infinite For Loop For Small C[]

本文关键字:循环 字符串 无限 For      更新时间:2023-10-16

为什么使用for循环时c-string长度很重要?终止字符""是否有问题?

下面的代码将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字符串中添加't',代码运行得非常好:

    char c[] = "charact";
    int i;
    for (i=0; i < 8 ; i++)
    {
        cout << c[i] << endl;
    }

在您的第一个版本中,没有字符c[7]。你在数组中有7个字符,6个字符串字符和1个空结束符:

Array:   c h a r a c 
Indices: 0 1 2 3 4 5 6

尝试访问超出此范围的任何内容是未定义的行为。

在你的第二个版本中,假设你正在运行的代码有你忘记在发布的版本中放入的t,数组有8个字符,并且循环保持在数组的边界内。

您有一个长度为7 (6 + null终止符)的字符串,并且正在尝试访问第8个元素。这将导致未定义的行为

我认为你正在走过字符数组的末尾。通过添加额外的字符,您的字符串现在有7个字符长,因此i<8测试可以工作。

您已超过数组的末尾。C从0开始索引,所以6个字符字符串的最后一个索引是5。如果你包括空终止符,那么你有六个,但你正在访问第七个数组位置。

c[7]不存在,因为c[6]是空终止字符。但是当你把它改成" character "时,c[7]就变成了null终止字符,所以它可以正常运行。