C 库函数 - memcpy()

memcpy

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。

在线编译工具:link.
https://c.runoob.com/compile/11/

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char src[50] = "1234567890";
   char *s="123456";
   char dest[50]= "abcdefghijklmnopqrst";
   char dest2[50]= "ABCDEFghijklmnopqrst";
	
   memcpy(dest, src, 3);  //从dest第一个字符开始替换为src的前3个字符
   printf("dest = %s\n", dest);
	
   memcpy(&dest2[2], src, 3); //从dest的dest[2],第三个字符开始替换为src的前3个字符
   printf("dest2 = %s\n", dest2);
	
   memcpy(dest, &src[7], 3);  //从dest第一个字符开始替换为src的src[7]开始的连续后3个字符
   printf("dest = %s\n", dest);
	
   memcpy(&dest2[6], s+2, 3);
   printf("dest2 = %s\n", dest2);
   
   return(0);
}

在这里插入图片描述

字符串内容比较

strcmp

strcmp是C语言比较字符串的库函数,形式为int strcmp(char *a, char *b);
该函数会对a和b的每个字符,按照ascii码值比较,如果二者完全相同返回0;如果a的ascii码值先出现较大者,会返回1;否则返回-1。

strstr()

C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。

#include <stdio.h>
#include <string.h>
 
 
int main()
{
   const char haystack[20] = "RUNOOB";
   const char needle[10] = "NOOB";
   char *ret;
 
   ret = strstr(haystack, needle);
 
   printf("子字符串是: %s\n", ret);
   
   return(0);
}

产生以下结果:

子字符串是: NOOB

memset函数详解(给字符串赋指定值,数组清空用)

memset(首地址,,sizeof(地址总大小));
memset(a,0,sizeof(a));

重点
memset以字节为单位进行初始化,这句话是什么意思呢?就是说它进行初始化时并不关心你要初始化的数组是什么类型的,它均以字节为单位进行初始化。
比如你的数组是int型的。int为4字节。但是memset以字节进行初始化

memset(a,1,sizeof(a));

在a中每个元素占 4字节
比如int型的0为 0x00000000
int 型的最大值为 0x7FFFFFFF
0xF = 0b1111 占四位
1字节为8bit ,所以两位为1字节
使用memset进行初始化后会变为 0x01010101 也就是16843009
所以一下两种初始化效果是一样的

memset(a,-1,sizeof(a));
memset(a,255,sizeof(a));

sprintf()

C 库函数 int sprintf(char *str, const char *format, …) 发送格式化输出到 str 所指向的字符串。

#include <stdio.h>
#include <math.h>

int main()
{
   char str[80];

   sprintf(str, "Pi 的值 = %f", M_PI);
   puts(str);
   
   return(0);
}

puts()

puts() 输出更简洁、更方便。而且使用 puts() 函数连换行符 ‘\n’ 都省了,使用 puts() 显示字符串时,系统会自动在其后添加一个换行符,

printf("%s\n", name);

puts(name);

等价

printf("输出结果是:%s\n", str);
puts(输出结果是:str);
# include <stdio.h>
int main(void)
{
    char name[] = "祖国!";
    printf("%s\n", name);  //用printf输出
    puts(name);  //用puts()输出
    puts("我爱你!");  //直接输出字符串
    return 0;
}

输出结果是:
祖国!祖国!我爱你!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C语言实现Base64编解码的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> const char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char *base64_encode(const unsigned char *data, size_t input_length, size_t *output_length) { *output_length = 4 * ((input_length + 2) / 3); char *encoded_data = malloc(*output_length); if (encoded_data == NULL) return NULL; for (size_t i = 0, j = 0; i < input_length;) { uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0; uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0; uint32_t octet_c = i < input_length ? (unsigned char)data[i++] : 0; uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; encoded_data[j++] = base64_table[(triple >> 3 * 6) & 0x3F]; encoded_data[j++] = base64_table[(triple >> 2 * 6) & 0x3F]; encoded_data[j++] = base64_table[(triple >> 1 * 6) & 0x3F]; encoded_data[j++] = base64_table[(triple >> 0 * 6) & 0x3F]; } static const char padding[] = {'=', '=', '\0', '\0'}; memcpy(encoded_data + *output_length - strlen(padding), padding, strlen(padding)); return encoded_data; } unsigned char *base64_decode(const char *data, size_t input_length, size_t *output_length) { if (input_length % 4 != 0) return NULL; *output_length = input_length / 4 * 3; if (data[input_length - 1] == '=') (*output_length)--; if (data[input_length - 2] == '=') (*output_length)--; unsigned char *decoded_data = malloc(*output_length); if (decoded_data == NULL) return NULL; for (size_t i = 0, j = 0; i < input_length;) { uint32_t sextet_a = data[i] == '=' ? 0 & i++ : base64_table[(uint8_t)data[i++]]; uint32_t sextet_b = data[i] == '=' ? 0 & i++ : base64_table[(uint8_t)data[i++]]; uint32_t sextet_c = data[i] == '=' ? 0 & i++ : base64_table[(uint8_t)data[i++]]; uint32_t sextet_d = data[i] == '=' ? 0 & i++ : base64_table[(uint8_t)data[i++]]; uint32_t triple = (sextet_a << 3 * 6) + (sextet_b << 2 * 6) + (sextet_c << 1 * 6) + (sextet_d << 0 * 6); if (j < *output_length) decoded_data[j++] = (triple >> 2 * 8) & 0xFF; if (j < *output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF; if (j < *output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF; } return decoded_data; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值