如何解决这个问题?显示基思错误

How to resolve this issue ? showing keith error

我在写一个简单的c++程序

#include <bits/stdc++.h>
#define ll long long
#define ul unsigned long long
#define ld long double
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define repi(i, a, b) for (int i = (a); i > (b); i--)
#define all(x) x.begin(), x.end()
#define ks(x) (cout << #x << ":" << (x) << '\n')
#define fastio ios_base::sync_with_stdio(false), cin.tie(nullptr)
#define gcd _gcd
using namespace std;
const ll mod = 1000000007;

int main()
{
    fastio;
    ll tc = 1;
    cin >> tc;
    for (ll t = 0; t < tc; t++)
    {
        ll n;
        cin >> n;
        string s;
        cin >> s;
        ll cnt = 0;
        ll i = n - 1;
        if (s[n - 1] == ')')
        {
            i--;
            cnt++;
            while (s[i] == ')' && i > -1)
            {
                i--;
                cnt++;
            }
        }
        if (cnt > n / 2)
            cout << "YES\n";
        else
        {
            cout << "NO\n";
        }
    }
    return 0;
}

输入 *

5
2
))
12
gl))hf))))))
9
gege)))))
14
)aa))b))))))))
1
)*

但它显示的输出我无法理解请帮助

/home/keith/builds/mingw/gcc-9.2.0-mingw32-cross-native/mingw32/libstdc++-v3/include/bits/basic_string.h:1067: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator[](std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference = char&; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = unsigned int]: Assertion '__pos <= size()' failed.

断言 __pos <= size() 意味着您正在使用 [] 运算符访问字符串 s 的末尾。 运行 调试器中的程序,或者在索引 > size() 上设置条件断点,或者只检查每次访问。

  1. s 和 n 都是从 cin 中读取的(与 n = s.size() 相对),如果 n > s.size() + 2 应该触发它。
  2. n 是类型(有符号)long long,并且 operator[] 期望 size_t(unsigned long)所以 n <= 0 也可能会触发它,就像您在访问时执行 n - 1 一样。
  3. 在您的 while 循环中,您 s[i] == ')' && i > -1 和 i = -1 将首先尝试访问 s[-1],然后再将 i > -1 检查为 && 运算符作为从左到-的关联性对。

这是错误的

while (s[i] == ')' && i > -1)

应该是

while (i > -1 && s[i] == ')')

如果 i 等于 -1,那么在第一个版本中 s[i] 会给出您可以看到的错误。但是在第二个版本中 i > -1 首先被评估,因为它是 false s[i] 没有被评估,所以不会导致错误。

这里还有一个重要的教训。该程序在您朋友的机器上运行,但并非所有出错的程序都会失败。它甚至可能 运行 正确。