重头开始嵌入式第十四天(指针操作字符串)

const关键字使用

 

在 C 语言中, const 关键字用于声明常量。以下是 const 关键字的常见用法:
 
1. 修饰变量:
 
- 声明一个值不能被修改的变量。例如: const int num = 10;  在此之后,尝试修改 num 的值将会导致编译错误。
2. 修饰指针:
 
- 指向常量的指针: const int *ptr;  表示指针指向的内容不能通过该指针修改,但指针本身可以指向其他地址。
- 常量指针: int * const ptr;  表示指针本身不能指向其他地址,但可以通过该指针修改其指向的内容。
- 指向常量的常量指针: const int * const ptr;  指针本身和其指向的内容都不能被修改。
3. 作为函数参数:
 
- 可以防止函数内部意外修改传入的参数值。
4. 修饰数组:
 
-  const int arr[] = {1, 2, 3};  数组中的元素不能被修改。
 
 const 关键字的使用可以增强程序的可读性和可维护性,同时有助于避免一些由于意外修改值而导致的错误。

 

指针操作一维字符型数组(字符串)

 

在 C 语言中,使用指针操作字符串具有以下优点:

 

优点:

 

1. 灵活性高:能够直接访问和修改字符串中的字符,提供了更细粒度的控制。

2. 节省内存:通过指针传递字符串可以避免复制整个字符串,从而节省内存和提高性能,特别是在处理大型字符串时。

3. 高效的字符串处理:可以方便地实现字符串的拼接、截取、查找等操作。

 

然而,也存在一些缺点:

 

缺点:

 

1. 容易出错:指针操作需要谨慎处理,否则可能导致内存访问错误,如越界访问,这可能导致程序崩溃或产生不可预测的结果。

2. 可读性较差:对于不熟悉指针操作的开发者来说,代码可能较难理解和维护。

3. 内存管理复杂:需要手动管理内存的分配和释放,若处理不当可能导致内存泄漏。

 以下是指针操作字符串的事例

my_puts

int my_puts(const char *str)
{
	while (*str!= '\0') {
		putchar(*str);
		str++;
	}
	putchar('\n');
	return 0;
}

my_gets

char *my_gets(char *s)
{
	char *ret=s;
	int i = 0;
	while ((*s++ = getchar())!= '\n') ;
	*--s = '\0';
	return ret;
}

my_strlen

size_t my_strlen(const char *str)
{
	size_t len=0;
	while(*str!='\0')
	{
		str++;
		len++;
	}
	return len;
}

my_strcpy

char *my_strcpy(char *dest, const char *src)
{
	char *ret=dest;
	while((*dest++ = *src++) != '\0');
	return ret;
}

my_strncpy

char *my_strncpy(char *dest, const char *src,size_t n)
{
	char *ret=dest;
	while(n && (*dest++ = *src++) != '\0')
		n--;
	while(n--)
		*dest++ = '\0';
	return ret;
}

my_strcat

char *my_strcat(char *dest,const char *src)
{
	char *ret = dest;
	while(*dest++ != '\0') ;
	dest--;
	while((*dest++ =*src++)!='\0');
	return ret;
}

my_strncat

char *my_strncat(char *dest,const char *src,size_t n)
{
	char *ret = dest;
	while(*dest++ != '\0') ;
	dest--;
	while(n && (*dest++ =*src++)!='\0')
		n--;
	if(n)
		*dest='\0';

	return ret;
}

my_strcmp

int my_strcmp(const char *str1,const char *str2)
{
	while(*str1!='\0' && *str2!='\0'&& *str1 == *str2 )
	{
		++str1;
		++str2;
	}
	return *str1-*str2;
}

my_strncmp

int my_strncmp(const char *str1,const char *str2,size_t n)
{
	while(*str1!='\0' && *str2!='\0'&& *str1 == *str2 && n>1 )
	{
		++str1;
		++str2;
		--n;
	}
	return *str1-*str2;
}

my_memcpy

void *my_memcpy(void *dest,const void *src,size_t n)
{
char *q = dest;
const char *p =src;
while(n)
{
	*q++ = *p++;
	--n;
}
return ;
}

 

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用循环遍历字符串,每隔一定长度就添加换行符,并计算每一行的长度,再根据总长度计算左侧空格的数量,从而实现字符串居中输出。 下面是一个示例代码: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 40 // 每行最大长度 void print_center(char* str) { int len = strlen(str); int start = 0, end = 0; // 当前行的起始位置和结束位置 int line_len = 0; // 当前行的长度 int total_len = 0; // 总长度 int space_num = 0; // 左侧空格数量 // 计算总长度 for (int i = 0; i < len; i++) { if (str[i] != '\n') { total_len++; } } // 循环遍历字符串,每隔一定长度就添加换行符,并计算每一行的长度和左侧空格数量 while (end < len) { if (str[end] == '\n') { // 遇到换行符时,直接输出一行 for (int i = start; i <= end; i++) { putchar(str[i]); } start = end + 1; end = start; line_len = 0; putchar('\n'); continue; } if (line_len >= MAX_LEN) { // 当前行已达到最大长度,需要换行 // 计算左侧空格数量 space_num = (MAX_LEN - (line_len - (end - start))) / 2; for (int i = 0; i < space_num; i++) { putchar(' '); } for (int i = start; i < end; i++) { putchar(str[i]); } start = end; line_len = 0; putchar('\n'); continue; } line_len++; end++; } // 输出最后一行 if (start < len) { space_num = (MAX_LEN - (line_len - (end - start))) / 2; for (int i = 0; i < space_num; i++) { putchar(' '); } for (int i = start; i < len; i++) { if (str[i] == '\n') { break; } putchar(str[i]); } putchar('\n'); } } int main() { char str[] = "This is a long string that needs to be printed in the center of the screen.\nIt should be broken into multiple lines, with each line centered.\n"; print_center(str); return 0; } ``` 输出结果如下: ``` This is a long string that needs to be printed in the center of the screen. It should be broken into multiple lines, with each line centered. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值