【问题标题】:What's being compared to the last element of the array?与数组的最后一个元素进行比较的是什么?
【发布时间】:2021-11-14 13:43:00
【问题描述】:

有一种我不明白的行为,每当数组的元素不等于它旁边的元素时,c 变量应该增加一,但是有一个自动完成的增量将c 增加一。我认为这是因为数组的最后一个元素与不等于它的东西进行了比较。为什么会这样?或者,如果我是对的,最后一个元素的比较对象是什么?

#include <iostream>

int main() {
    int n, c = 0;
    std::cin >> n;
    std::string s[n];
    for (int i = 0; i < n; i++) {
        std::cin >> s[i];
    }
    for (int i = 0; i < n; i++) {
        if (s[i] != s[i+1]) {
            c++;
        }
    }
    std::cout << c;
}

【问题讨论】:

  • 请注意 std::string s[n]; 不是有效的 C++。可变长度数组仅适用于编译器扩展。见Why aren't variable-length arrays part of the C++ standard?
  • 1) s[n] 是一个可变长度数组,它是非标准的 2) 你的第二个 for 循环将访问越界内存,这是未定义的行为;到那时,所有赌注都结束了
  • @Muhamed Elsayed 是否有任何答案可以帮助您了解它的工作原理?如果是这样,请考虑accepting 的答案。

标签: c++ arrays loops


【解决方案1】:
s[s.length()] == ‘\0’

从这里:https://www.cplusplus.com/reference/string/string/operator%5B%5D/

“如果 pos 等于字符串长度,则函数返回对字符串中最后一个字符后面的空字符的引用(不应修改)。”

【讨论】:

  • 这适用于单个std::string,但s[] 是一个字符串数组。
【解决方案2】:

std::string s[n]; 正在创建所谓的“可变长度数组”which is NOT part of standard C++,但某些编译器支持将其作为扩展。不要依赖这个。使用 std::vector 代替动态长度数组,其长度直到运行时才知道。

但是,更重要的是,您的第二个循环具有未定义的行为s[] 数组元素的有效索引是 0..n-1,所以在循环的最后一次迭代中,s[i] 访问数组中的最后一个字符串,s[i+1] 访问 越界,所以与s[i] 进行比较的值是indeterminate(如果代码不会因为访问无效内存而直接崩溃)。

【讨论】:

  • 那么使用向量还是动态数组更好?
  • @MuhamedElsayed 更喜欢 std::vector,除非您出于任何原因(项目/编译器限制等)无法使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多