如何解决这个问题?显示基思错误
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() 上设置条件断点,或者只检查每次访问。
- s 和 n 都是从 cin 中读取的(与 n = s.size() 相对),如果 n > s.size() + 2 应该触发它。
- n 是类型(有符号)long long,并且 operator[] 期望 size_t(unsigned long)所以 n <= 0 也可能会触发它,就像您在访问时执行 n - 1 一样。
- 在您的 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]
没有被评估,所以不会导致错误。
这里还有一个重要的教训。该程序在您朋友的机器上运行,但并非所有出错的程序都会失败。它甚至可能 运行 正确。
我在写一个简单的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() 上设置条件断点,或者只检查每次访问。
- s 和 n 都是从 cin 中读取的(与 n = s.size() 相对),如果 n > s.size() + 2 应该触发它。
- n 是类型(有符号)long long,并且 operator[] 期望 size_t(unsigned long)所以 n <= 0 也可能会触发它,就像您在访问时执行 n - 1 一样。
- 在您的 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]
没有被评估,所以不会导致错误。
这里还有一个重要的教训。该程序在您朋友的机器上运行,但并非所有出错的程序都会失败。它甚至可能 运行 正确。