C语言 重写四个字符串操作函数(练习)

  1. 实现一个函数返回字符串str的长度(即空值结束符之前的字符数目)
#include <stdio.h>
#include <assert.h>

size_t _strlen(const char* str)
{
	assert(NULL != str);
	const char* tmp = str;
	while(*tmp) tmp++;
	return tmp-str;
}
  1. 实现一个函数将字符串src中的内容赋值到dest中
#include <stdio.h>
#include <assert.h>

char* _strcpy(char* dest,const char* src)
{
	assert(NULL != dest && NULL != src);
	char* tmp = dest;
	while(*tmp++ = *src++)
	return dest;
}
  1. 实现一个函数连接两个字符串
#include <stdio.h>
#include <assert.h>

char* _strcat(char* dest,const char* src)
{
	assert(NULL != dest && NULL != src);
	char* tmp = dest;
	while(*tmp) tmp++;
	while(*tmp++ = *sr++);
	return dest
}
  1. 实现一个函数比较两个字符串
#include <stdio.h>
#include <assert.h>

int _strcmp(const char* s1,const char* s2)
{
	assert(NULL != s1 && NULL != s2);
	while(*s1 == *s2 && *s1) s1++,s2++;
	if(*s1 > *s2)
		return 1;
	if(*s1 < *s2)
		return -1;
	return 0;
}

assert (断言)的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C语言重写的代码,并附有详细注释: ```c #include <stdio.h> #include "pico/stdlib.h" #include "hardware/spi.h" #include "hardware/timer.h" // 定义SPI总线的引脚 #define PIN_SCK 2 #define PIN_MOSI 3 #define PIN_MISO 4 // 定义SPI总线的时钟速率 #define SPI_FREQUENCY 2500000 // 定义RGB颜色通道的引脚 #define PIN_RED 5 #define PIN_GREEN 6 #define PIN_BLUE 7 // 定义重置字节长度和输出字节长度 #define RESET_BYTE_LENGTH 16 #define OUT_BYTE_LENGTH 25 // 定义RGB颜色通道的数值 #define RED 255 #define GREEN 128 #define BLUE 63 // 定义定时器和SPI总线的句柄 timer_config_t timer_config; spi_inst_t *spi; uint8_t out_byte[OUT_BYTE_LENGTH]; // 将一个字节转换为8位二进制字符串 char *byte_to_binary(uint8_t b) { static char binary[9]; binary[0] = '\0'; for (int i = 128; i > 0; i >>= 1) { strcat(binary, ((b & i) == i) ? "1" : "0"); } return binary; } // 将RGB三个颜色通道的数值转换为需要传输的16个字节的数据 void rgb_to_byte(uint8_t r, uint8_t g, uint8_t b, uint8_t *out_byte) { char str[24]; sprintf(str, "%s%s%s", byte_to_binary(g), byte_to_binary(r), byte_to_binary(b)); for (int i = 0; i < 9; i++) { uint8_t byte = 0; for (int j = 0; j < 8; j++) { byte |= ((str[i * 8 + j] == '1') ? 0x80 : 0x00) >> j; } out_byte[i] = byte; } } int main() { // 初始化Pico SDK库 stdio_init_all(); // 初始化SPI总线 spi = spi_init(spi0, SPI_FREQUENCY); gpio_set_function(PIN_SCK, GPIO_FUNC_SPI); gpio_set_function(PIN_MOSI, GPIO_FUNC_SPI); gpio_set_function(PIN_MISO, GPIO_FUNC_SPI); spi_set_format(spi, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST); spi_set_slave(spi, false); spi_set_hw_cs(spi, NULL); // 初始化定时器 timer_config_init(&timer_config); timer_config.divider = 625; // 1ms的分频器 timer_config.alarm_en = TIMER_ALARM_EN; timer_config.counter_en = true; timer_init(TIMER_ALARM, &timer_config); // 初始化RGB颜色通道的引脚 gpio_init(PIN_RED); gpio_init(PIN_GREEN); gpio_init(PIN_BLUE); gpio_set_dir(PIN_RED, GPIO_OUT); gpio_set_dir(PIN_GREEN, GPIO_OUT); gpio_set_dir(PIN_BLUE, GPIO_OUT); // 定义重置字节和输出字节 uint8_t reset_byte[RESET_BYTE_LENGTH]; memset(reset_byte, 0xFF, RESET_BYTE_LENGTH); rgb_to_byte(RED, GREEN, BLUE, out_byte); memcpy(out_byte, reset_byte, RESET_BYTE_LENGTH); // 在定时器中循环调用SPI传输函数 while (true) { if (timer_alarm_is_up(TIMER_ALARM)) { // 将输出字节写入SPI总线 spi_write_blocking(spi, out_byte, OUT_BYTE_LENGTH); // 等待10毫秒 sleep_ms(10); // 重置定时器 timer_set_alarm_value(TIMER_ALARM, 1000); timer_alarm_clear(TIMER_ALARM); } } return 0; } ``` 注释详解: - 第1-5行:包含了所需的标准C库和Pico SDK库头文件。 - 第7-9行:定义了SPI总线的引脚。 - 第11-13行:定义了SPI总线的时钟速率。 - 第15-17行:定义了RGB颜色通道的引脚。 - 第19-20行:定义了重置字节长度和输出字节长度。 - 第22-24行:定义了RGB颜色通道的数值。 - 第26-30行:定义了定时器和SPI总线的句柄。 - 第32-48行:定义了`byte_to_binary`函数,将一个字节转换为8位二进制字符串。 - 第50-67行:定义了`rgb_to_byte`函数,将RGB三个颜色通道的数值转换为需要传输的16个字节的数据。 - 第69-87行:`main`函数,包含了整个程序的主要逻辑。 - 第72-85行:初始化SPI总线和定时器,以及RGB颜色通道的引脚。 - 第87行:在定时器中循环调用SPI传输函数。 - 第89-93行:将输出字节写入SPI总线。 - 第95-97行:等待10毫秒。 - 第99-101行:重置定时器,并清除定时器的中断标志。 - 第87-102行:这个循环会不断地重复这个过程,从而控制外设(例如LED灯)的颜色输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值