文章目录
前言
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…的和、水仙花数、反转字符串等小案例