我正在尝试根据规则对字符串进行排序。 C ++代码在大多数情况下都可以工作,但在某些情况下会出现错误:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
我之前已经看到过此错误,当我们尝试将字符串初始化为null指针或0(在内部转换为null指针)时会发生此错误。我检查了排序期间是否发生了错误,并且仅当我使用自定义函数进行比较时才发生。再一次,我不知道为什么仅在某些情况下会发生这种情况。
代码是:
#include <algorithm>
#include <sstream>
#include <iostream>
#include <vector>
#include <string>
using std::vector;
using std::string;
bool greater(string a, string b) {
int i = 0;
a = a + a[0];
b = b + b[0];
while(i<a.size() && i<b.size()) {
if(a[i] != b[i]) {
if(a[i] - '0' > b[i] - '0')
return true;
else return false;
}
i++;
}
}
string largest_number(vector<string> a) {
std::sort(a.begin(), a.end(), greater);
std::stringstream ret;
for (size_t i = 0; i < a.size(); i++) {
ret << a[i];
}
string result;
ret >> result;
return result;
}
int main() {
int n;
std::cin >> n;
vector<string> a(n);
for (size_t i = 0; i < a.size(); i++) {
std::cin >> a[i];
}
std::cout << largest_number(a);
return 0;
}
出现错误的情况之一是:
100
2 8 2 3 6 4 1 1 10 6 3 3 6 1 3 8 4 6 1 10 8 4 10 4 1 3 2 3 2 6 1 5 2 9 8 5 10 8 7 9 6 4 2 6 3 8 8 9 8 2 9 10 3 10 7 5 7 1 7 5 1 4 7 6 1 10 5 4 8 4 2 7 8 1 1 7 4 1 1 9 8 6 5 9 9 3 7 6 3 10 8 10 7 2 5 1 1 9 9 5
解决方案: 感谢帮助。之所以发生错误,是因为比较函数一旦退出循环,就不会返回任何内容。这是有效的更新功能。
bool greater(string a, string b) {
int i = 0;
a = a + a[0];
b = b + b[0];
while(i<a.size() && i<b.size()) {
if(a[i] > b[i])
return true;
i++;
}
return false;
}
答案 0 :(得分:3)
我可以看到的代码唯一的问题(实际上我是在在线编译器中尝试过,它给了我这个警告)是,如果两个字符串相等,则您不会从SQL> CREATE TABLE workspace (workspace_result_id NUMBER);
Table created.
SQL> CREATE TABLE result (id NUMBER);
Table created.
SQL> CREATE TRIGGER delete_workspace_on_delete_result
2 BEFORE DELETE
3 ON RESULT
4 FOR EACH ROW
5 BEGIN
6 DELETE FROM WORKSPACE
7 WHERE workspace_result_id = :old.id;
8 END;
9 /
CREATE TRIGGER delete_workspace_on_delete_result
*
ERROR at line 1:
ORA-00972: identifier is too long
SQL> CREATE TRIGGER delete_workspace_on_del_result
2 BEFORE DELETE
3 ON RESULT
4 FOR EACH ROW
5 BEGIN
6 DELETE FROM WORKSPACE
7 WHERE workspace_result_id = :old.id;
8 END;
9 /
Trigger created.
SQL>
返回任何内容:>
greater
尝试插入return语句。 (当然,如果两个事物相等,那么任何一个都不大于另一个,因此具体来说就是您想要的bool greater(string a, string b) {
int i = 0;
a = a;
b = b;
while(i<a.size() && i<b.size()) {
if(a[i] != b[i]) {
if(a[i] - '0' > b[i] - '0')
return true;
else return false;
}
i++;
}
// <---- what about here?
}
。)在没有return false
语句的情况下退出函数的结尾未定义的行为(return
或返回int main()
的任何函数除外),因此您可能希望在发生这种情况时看到所有内容,包括崩溃的类型。
[编辑:正如gst所说,如果一个字符串是另一个字符串的前缀,例如void
和"1"
。因此,您需要更多的代码来测试哪个,而不仅仅是"10"
。但是您可以看到是否有一行可以解决崩溃问题:这在逻辑上是错误的,但至少不是未定义的行为。]