【发布时间】:2021-10-05 11:25:18
【问题描述】:
大家好,这是我的代码。 我不能使用 cin 和 getline() 所以我不得不使用 scanf。 它按预期读取所有值,但在输入最后一个值后它说:
free(): 无效指针 ./comp: line 8: 877 Aborted (core dumped) ./$BIN
无论如何,这里是代码。 帮助将不胜感激。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
// n -> amount of lines of code.
// q -> amount of queries.
int n, q;
cin >> n >> q;
// Handle source code Input.
vector<string> v(n);
for (unsigned i = 0; i < n; ++i)
{
cout << "i: " << i << endl;
scanf("%s", &v[i]);
}
return 0;
}
【问题讨论】:
-
std::string不能很好地与scanf("%s配合使用。这个想法到底是在哪里培养的?您说,“我不能使用 cin 和 getline()” - 因为...?也许我们可以通过展示您在这方面的尝试来解决那个问题,而不是把这只 X 兔子追到一个 Y 洞里。 -
%s格式参数表示指向char数组的指针即将到来。std::string比char数组复杂得多。另请注意,scanf是一个 C 函数。它对std::string这样的 C++ 结构一无所知,而且几乎肯定会错误地使用它们。 -
顺便说一下,在任何语言中,但尤其是在像 C++ 这样容易出错的语言中,您应该始终将警告设置为他们会去的。在 g++ 和 clang 中,您可以将
-Wall传递给编译器以打开所有警告。如果你这样做了,你会从编译器那里得到一个解释这个问题的警告。 -
Silvio Mayolo 关于额外警告的评论的附录,它还有助于在编译时提高优化级别。为了优化代码,编译器必须仔细查看代码,而仔细查看可能会暴露编译器可能遗漏的潜在错误。