代码修炼:编程中疏漏错误(实时更新)

前言

此文为记录在代码修炼过程中遇到的各种匪夷所思、难以置信的小错误、小疏漏。

代码能力是需要一点点修炼和积累出来的,而错误一定会有。所以一个好方法是:

遇到了,就随手记下来,实在过意不去了,脑门拍一拍哈?

正文

时间戳

2019年7月10日

  • 等号与赋值!!今天已经不止三次因为这个而错误了!
if (hashTable[M] == 0) {
            hashTable[M] == 1;
            if (i == 0) printf("%d", M);
            else printf(" %d", M);

这错的可能机器都发现不了。。。

2019年6月5日

  • 最愚蠢的错误!!最简单的for循环,然而一旦变量名不注意,各种段错误和异常,特别是i和j这种,自己都看不出来……

2019年5月26日

  • 申请指针型变量一定要记住,每一个变量名都要有*,比如int* num1, *num2, *num3

2019年5月17日

  • strlen()返回的是‘\0’之前的字符个数,如果要进行数组遍历,一定要留心遍历的起始位置。

2019年5月12日

  • 递归函数的if-else,if用于判断是否要递归,而else是不满足else的情况,递归是要有底线的,如果没有一条必须执行的底线,那么根本完成不了递归。比如:
void ZeroFlag(Tree T)
{
    if (T->Left)
        ZeroFlag(T->Left);
    if (T->Right)
        ZeroFlag(T->Right);
    else T->flag = 0;
}

void FreeTree(Tree T)
{
    if (T->Left)
        FreeTree(T->Left);
    if (T->Right)
        FreeTree(T->Right);
    else free(T);
}

显然,else误了大事,并且还不容易发觉。不过,意识到了递归调用必须要有底线,至少能避免一些此类的幼稚错误。

2019年5月5日

  • 编写C语言时,if条件之类省略{},得需要有严谨的意识!否则,很可能真的不知道自己错在了哪里,比如下面这个:
for (int i = 0; i < n; i++) {
        thisSum += num[i];
        if (thisSum > maxSum){
            maxSum = thisSum;
            endN = i;
            startN = tempN;
        }
        else if (thisSum < 0){
            thisSum = 0;
            tempN = i + 1;
        }
    }

for (int i = 0; i < n; i++) {
        thisSum += num[i];
        if (thisSum > maxSum){
            maxSum = thisSum;
            endN = i;
            startN = tempN;
        }
        else if (thisSum < 0)
            thisSum = 0;
            tempN = i + 1;
    }
//对比一下,机器是不会报错的,反而会老老实实执行。

2019年4月28日

  • C11标准中不能再使用gets(),如果需要读入整行字符串,要用fgets,用法如下
fgets(str, siezof(str), stdin);
//注意换行符也会被读入。
  • 关于字符和字符串,以及字符串数组的大小,字符串是以'\0'结尾的。
const char pin[10][5] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
//const char pin[10][4] = {'ling', 'yi', 'er', 'san', 'si', 'wu', 'liu', 'qi', 'ba', 'jiu'};
  • 关于字符串的输入,用scanf()暂时没啥问题。scan("%s", &str)的%s是以空格和换行作为结束。
scanf("%s", num);
    //fgets(num, sizeof(num), stdin);

2019年4月21日

  • 关于逻辑与的问题,来自PTA B1012,暂时不理解为什么分别两个if和一个if下的&&是不同的。
  • 关于结构的访问,如果结构里定义的是数组,通过数组名访问,其本身就是地址,不需要&符号。比如:
struct student {
    char name[11];
    char id[11];
    int score;
}stuMax, stuMin, temp;

scanf("%s %s %d", temp.name, temp.id, &temp.score);
  • if-else语句,if可以有条件,但是else不需要再分支了!
if (a.yy != b.yy) return a.yy >= b.yy;
    else if (a.mm != b.mm) return a.mm >= b.mm;
    else (a.dd != b.dd) return a.dd >= b.dd;
}
//这样写得有点“愚蠢”

2019年4月12日

  • return 0;怎么能写在循环语句里呢?

  • 换行!换行!习惯性换行!\n

  • 愚蠢的错误:字符串直接用gets()或者直接用scanf读入啊!整什么循环啊!字符串是一个整体!!

char a[11];
    for (int i = 0; i < strlen(a); i++){
        scanf("%s", a);
    }


 

发布了146 篇原创文章 · 获赞 42 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/SmartLoveyu/article/details/89254799