gpt4 book ai didi

c++ - 回文之谜: Why an array of size 3 ends up being printed with 5 elements?

转载 作者:行者123 更新时间:2023-12-02 19:02:15 25 4
gpt4 key购买 nike

#include <iostream>
#include <cstring>

using namespace std;

int main(){

char a[] = "abc";
char b[2];
for(int i = 0,k = 2;i < 3;i++,k--){
b[k] = a[i];
cout << i << " " << k << endl;
}
if(strcmp(a,b) == 0){
cout << "palindrome";
}else{
cout << "no palindrome" << endl;
}
cout << "a: " << a << endl;
cout << "b: " << b << endl;

return 0;
}

输出:

0 2 

1 1

2 0

no palindrom

a: abc

b: cbabc

我不明白为什么 b 数组最终有 5 个元素,而该数组只包含 3 个元素。此外,循环仅循环 3 次,这是我得到的输出......一个谜。

最佳答案

您有越界数组访问权限,并且还需要注意以空值终止字符串!

具体来说,char b[2]; 为您提供了一个恰好包含 2 个 char 的数组,因此只有 b[0]b[1] 有效。您还需要考虑应终止所有 C 样式字符串的空字符。例如,要保存 "cba",您需要 4 个元素。如果您打印 sizeof(a)(应为 4:'a'、'b'、'c'、'\0'),您也可以看到这一点。

基本上,您的程序会引发未定义的行为 (UB)。简单的修复方法是增大 b (与 a 大小相同,在本例中为 4)。更完整的答案是更仔细地管理数组长度,并查看更安全的“n”版本的 C 操作函数,例如 strncmp

编辑:为了完整起见,您有 2 个 UB 来源。第一个是在 k == 2 时的 b[k] = a[i] 行,因为您再次只分配了 b[0]b[1]。第二个是当您调用 strcmp 时,因为 b 尚未正确地以 null 终止,并且 strcmp 会很高兴地读取数组边界,但事实并非如此不知道。

关于c++ - 回文之谜: Why an array of size 3 ends up being printed with 5 elements?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65400569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com