如何将strlen()与2d数组一起使用?

时间:2019-03-27 18:30:31

标签: c++ multidimensional-array strlen

我想知道2D字符数组的水平大小。我为此找到了strlen(),但它仅适用于简单的char数组。使用2D时不起作用。任何想法?感谢您的回答!

char m[3][4];
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 4; j++){
            m[i][j] = ' ';
        }
    }

cout << "CHAR Matrix: " << endl;
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 4; j++){
            cout << "[" << m[i][j] << "]";
        }
        cout << endl;
    }

cout << "Sizeof matrix -> " << sizeof(m) << "B" << endl;

cout << "Length of Matrix strlen(m[0]): " << strlen(m[0]) << endl;

问题是,strlen(m [0])给了我18。我怎么能得到4?

1 个答案:

答案 0 :(得分:0)

您正在执行一些操作。上面的一些评论有帮助,但让我们仔细研究一下。

首先,如果您使用的是C ++并且持有字符串,则应使用std :: string。但是,您的问题表明您只是在学习,所以让我们坚持使用老式C。

您分配的是单个字符的二维数组。也就是说,您总共要存储12个字符的数据。

在C(或C ++)中,字符串以空值结尾。也就是说,如果您存储为字符串“ Hi”,则实际上是3个字符,而不是2个字符。 H,I和一个零字节,它指示字符串的结尾。

strlen只是计算直到零字节为止的字符数。因此,在我的示例中,为2。

您的数组中没有任何0字节,因此由于其他一些原因,strlen计数直到达到零为止-完全在数组之外。 kes!

所以...处理单个字符时使用字符串方法(strlen,strdup等)是错误的。

现在,最安全的方法是使用std :: string的向量,正如其他人所建议的那样。但是,我坚信在采取捷径之前先了解基础知识,这就是捷径。

因此,如果您真正想要的是3个字符串,但您想使用老式的C,则实际上应该有一个一维char *数组。

char *m[3];
m[0] = "Hello";
m[1] = "there";
m[2] = "everyone";

按照您的方式存储字符串真的很奇怪,使用固定长度的字符缓冲区保存字符串被认为是非常危险的。这就是臭名昭著的缓冲区溢出漏洞利用源,这是老式Web应用程序中最常见的漏洞利用。

或者,您可以修改示例。使m [3] [5],并在字符串末尾的每一行中存储一个零字节。 strlen()将开始工作。但这真的很丑。