第一句Error表示在“printf”前少了一个分号,
第二句Error表示在“return”前少了一个分号。
通常在错误行的上一行找缺失的分号。比如,
int main()
{
int sas //here;
printf("%d",a[7]);
if(1)
a[0]=1 //here;
return 0;
}
根据代码和上面图片的信息,很容易判断错误在哪。
比如这样:
void f(int a)
{
......
}
int main()
{
f();
return 0;
}
就会有这样的错误信息返回:
[Error] too few arguments to function ‘void f(int)’
说明我们在使用函数时给予的参数过少。
例如我们在使用string的时候,想要把字符串a赋为“abcde”。
于是我们写成了这样:
string a=abcde;
错误信息:
[Error] ‘abcde’ was not declared in this scope
我们应该清楚这是什么原因,计算机认为“abcde”是一个变量,但我们认为它是一个字符串。
怎么处理呢?
加个双引号。
string a="abcde";
int 类的函数就要返回一个int值,void函数就要直接return,搞错这个很容易出事的。
比如我们搞错了:
void f()
{
return 1;
}
错误信息:
看起来好复杂,其实就是void函数return了int值。把return 1; 改成return;就好了
但是不要怕,错误本身可能并不是多么复杂。
所以下面说一个sort常见的问题。
#include
#include
using namespace std;
struct A
{
int v,c;
}a[15];
int main()
{
for(int i=1;i<=10;i++)
scanf("%d",&a[i]);
sort(a+1,a+11);
}
然后就CE 了··· 而且错误信息辣么多QAQ
还会跳出来一串代码:
template<typename _RandomAccessIterator>
void
__insertion_sort(_RandomAccessIterator __first,
_RandomAccessIterator __last)
{
if (__first == __last)
return;
for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
{
if (*__i < *__first)
{
typename iterator_traits<_RandomAccessIterator>::value_type
__val = _GLIBCXX_MOVE(*__i);
_GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
*__first = _GLIBCXX_MOVE(__val);
}
else
std::__unguarded_linear_insert(__i);
}
}
看不懂啊QAQ
不过没关系,我们知道错误行是这个:
if (*__i < *__first){···}
啥意思呢?想想sort是用来干什么的?排序,对吧。而我们的a是一个结构体,里面包含着c,v两个数。
于是就得出结论:程序不知道按什么来排序了。
怎么办呢?手写cmp函数。
如果想按c排序,就这样:
bool cmp(A a,A b)
{
return a.c;
}
然后把sort改一下:
sort(a+1,a+11,cmp);
就这样,编译通过!
图有点大=V=
具体来说有以下解决方法:
①检查在scanf中是否加入了%、&等必要符号。
②检查数组是否越界(数组下标为负数、数组下标过大)。
③如果使用了STL,请认真检查与STL相关的语句,不管是函数还是数据结构。
④如果使用了指针,检查指针是否初始化为NULL。
⑤检查是否递归了太多次,导致爆栈。
先想想自己算法的正确性吧。
算法没错?看下面:
①是不是数组没有赋初值?
②是不是访问了非法内存(有时访问非法内存不会RE)?
③循环次数是否远远超过或低于预期?
④是不是爆int了?
①看看有没有把初值赋错。
②看看有没有把“==”写成了“=”。
③看看有没有弄混“>”“<”“>=”“<=”
④变量类型对不对?输出类型对不对(如scanf(“%c”,(int)a);)?
不一定要打开调试面板调试,输出中间变量也是一个很好的方法。
通过对比一个(或多个)关键变量在程序中的变化与预期变化的差距,往往能发现问题。
那你很棒棒哟!⊙v⊙