C语言仿写strlen函数以及编程常见的错误、以及,打印菱形、空瓶换水、水仙花数、反转字符串等小案例


前言

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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 20:38:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 20:38:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 20:38:01       82 阅读
  4. Python语言-面向对象

    2024-04-25 20:38:01       91 阅读

热门阅读

  1. Python自动化系列5

    2024-04-25 20:38:01       38 阅读
  2. 洛谷P1234题解

    2024-04-25 20:38:01       35 阅读
  3. ts-contention ss-contention等待事件

    2024-04-25 20:38:01       38 阅读
  4. Golang使用自定义IP请求https

    2024-04-25 20:38:01       32 阅读
  5. lettcode1005.k次取反后最大的数组和

    2024-04-25 20:38:01       148 阅读
  6. leetcode377--组合总数IV

    2024-04-25 20:38:01       34 阅读