文章目录
- 前言
- 一、仿写strlen函数
- 二、编程常见的错误
- 1. 编译型错误(语法错误)
- 2. 链接型错误(链接期间)
- 3. 运行时错误(最难找)
- 三、小案例
- 1. 打印菱形
- 2. 两个空瓶换一瓶水的实现
- 3. 打印 a+aa+aaa+aaaa+aaaaa......的和
- 4. 打印0-100000"水仙花数"
- 5. 反转字符串
- 总结
前言
C语言仿写strlen函数以及编程常见的错误、以及,打印菱形、空瓶换水、打印a+aa+aaa+aaaa+aaaaa…的和、水仙花数、反转字符串等小案例
一、仿写strlen函数
#include <stdio.h>
#include <assert.h>int my_strlen(const char* str)// 只计算长度不修改内容,所以const修饰
{int count = 0;// 不能对空指针解引用assert(str); // 如果str时空指针,则为假,assert报错while (*str != '\0'){count++;str++;}return count;
}int main()
{char ch[] = "hello bit";int len = my_strlen(ch);printf("%d", len);return 0;
}
二、编程常见的错误
- 从源文件 test.c 到 可执行程序,经历了 编译 和 链接 连个步骤。
1. 编译型错误(语法错误)
- 在编译阶段发生的错误就叫编译错误。
- 通常是指语法错误,这列错误编译器会直接报错,比较好找。
2. 链接型错误(链接期间)
- 在链接阶段发生的错误就叫链接错误。
- 链接型错误通常发生在链接阶段,如 函数调用,但没有声明。
- 或者,函数调用,但声明函数名书写错误。
3. 运行时错误(最难找)
- 这种错误发生通常是 编译 和 链接 通过, 但是程序运行结果错误,或没有结果。
- 只能通过调试慢慢去找。
- 积累经验。
三、小案例
1. 打印菱形
// 打印菱形
#include <stdio.h>int main()
{int line = 0;scanf("%d", &line);int i = 0;for (i = 0; i < line; i++){int j = 0;for (j = 0; j < line - 1-i; j++){printf(" ");}for (j = 0; j < 2 * i + 1; j++){printf("*");}printf("\n");}for (i = 0; i < line-1; i++){int j = 0;for (j = 0; j < i + 1; j++){printf(" ");}for (j = 0; j < 2 * (line -1-i)-1; j++){printf("*");}printf("\n");}return 0;
}
2. 两个空瓶换一瓶水的实现
- 题目大致为
- 1瓶水1块钱,2个空瓶子可以换1瓶水,共有money钱,问可以喝几瓶水?
#include <stdio.h>
int main()
{int empty = 0;int money = 0;int total = 0;scanf("%d", &money);total = money; // 有多少钱就总共喝几瓶水empty = money; // 有多少钱就有几个空瓶子while (empty >= 2){total += empty / 2; // 两个空瓶子换一瓶水 加到 原来的总数上empty = empty / 2 + empty % 2; // 空瓶子个数重置为,换了水之后重新得到的空瓶子,以及不够换剩下的空瓶子的和}printf("%d", total);return 0;
}
- 也可总结为 2 * money - 1。(数学规律)
3. 打印 a+aa+aaa+aaaa+aaaaa…的和
#include <stdio.h>
int main()
{int a = 0;int n = 0;scanf("%d %d", &a, &n);int i = 0;int sum = 0;int k = 0;for (i = 0; i < n; i++){k = k * 10 + a;sum = sum + k;}printf("%d", sum);return 0;
}
4. 打印0-100000"水仙花数"
- 水仙花数指的是三位数,这里认为满足各位数的位数次方的和等于整个数字的都是水仙花数
#include <stdio.h>
#include <math.h>
int main()
{int i = 0;for (i = 0; i < 100000; i++){int count = 1;int sum = 0;int tmp = i;while (tmp / 10 != 0){count++;tmp = tmp / 10;} // 先求出位数tmp = i;while (tmp){sum += pow(tmp % 10, count); // 各位数 count 次方的和tmp /= 10;}if (sum == i) // 是否等于原数{printf("%d ", i);}}return 0;
}
5. 反转字符串
#include <stdio.h>
#include <string.h>
int main()
{char arr[100001] = { 0 };gets(arr);int left = 0;int right = strlen(arr) - 1;while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}printf("%s", arr);return 0;
}
总结
C语言仿写strlen函数以及编程常见的错误、以及,打印菱形、空瓶换水、打印a+aa+aaa+aaaa+aaaaa…的和、水仙花数、反转字符串等小案例