c语言字符串相关——strlen与sizeof strcat与strncat strcpy与memcpy strcmp 数字char型+'0'与-'0' 字母char型+'a'与-'a' atoi等接口使用
strlen与sizeof
sizeof 统计了字符串结尾的\0,而 strlen() 函数没有
sizeof 在编译时确定,而 strlen在运行时生效
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "123";
printf("sizeof = %d\n", sizeof(str));
printf("strlen = %d", strlen(str));
return 0;
}
运行结果:
sizeof = 4
strlen = 3
strcat与strncat
strcat(dest,src);
strcat把src所指向的字符添加到dest结尾处(覆盖原dest结尾处的'\0'),并添加新的'\0'。
说明:src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串,返回指向dest的指针。
strncat(dest,src,n);
strncat把src所指向的字符的前n个字符添加到dest结尾处(覆盖原dest结尾处的'\0'),并添加新的'\0'。
说明:src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的前n个字符串,返回指向dest的指针。
strcat代码实例:
#include<stdio.h>
#include<string.h>
int main(void)
{
char input[] = "I love programming!";
char addon[] = " Programs love me!";
strcat(input,addon);
puts("The result was a mixture:");
puts(input);
puts("The second string remains oringinal:");
puts(addon);
puts("The first one have changed:");
puts(input);
return 0;
}
运行结果:
The result was a mixture:
I love programming! Programs love me!
The second string remains oringinal:
Programs love me!
The first one have changed:
I love programming! Programs love me!
strncat代码实例:
#include<stdio.h>
#include<string.h>
int main(void)
{
char result[50] = "See the result:";
char addon[] = "abcdefghijklmn";
puts("That's orinional result:");
puts(result);
strncat(result,addon,6);
puts("That's now:");
puts(result);
return 0;
}
运行结果:
That's origional result:
See the result:
That's now:
See the result:abcdef
strcpy与memcpy
strcpy
注意:strcpy会拷贝最后的'\0'结束符到dest,因此dest要开够长度
char * strcpy(char * dest, const char * src) // 实现src到dest的复制
{
if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性
{
return NULL;
}
char *strdest = dest; //保存目标字符串的首地址
while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的内容复制到dest下
return strdest;
}
memcpy
注意:memcpy只会拷贝指定长度的数据,因此对于字符串来说,要给memTo(dest)最后1位强制为'\0'
void *memcpy(void *memTo, const void *memFrom, size_t size)
{
if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效
return NULL;
char *tempFrom = (char *)memFrom; //保存memFrom首地址
char *tempTo = (char *)memTo; //保存memTo首地址
while(size -- > 0) //循环size次,复制memFrom的值到memTo中
*tempTo++ = *tempFrom++ ;
return memTo;
}
-
复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
-
复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
-
用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。
strcmp--字符串比较
函数实现:
int strcmp(const char* str1,const char* str2);
参数 str1 和 str2 是参与比较的两个字符串。
strcmp() 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(遇见'\0')。
返回值:
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。
注意:strcmp区分大小写
数字char型+'0'与-'0'
本质上char就是整型,可以通过+-'0'来转换,计算机内部用对应的ascii来转为二进制表示
char --> int : -'0'
char ch = '7';
/*
char ch = '7'
字符7,对应ascii十进制:55
printf打印:
%d 为 55
%c 为 7
如果希望%d可以打印出7,其实就是char-->int,则需要char - '0':
ch - '0'
*/
printf("ch = %d\n", ch);
printf("ch = %c\n", ch);
printf("ch - '0' = %d\n", ch - '0');
运行结果:
ch = 55
ch = 7
ch - '0' = 7
int --> char : +'0'
int num = 7;
/*
int num = 7;
数字7,对应ascii十进制:7
printf打印:
%d 为 7
如果希望%c可以打印出7,其实就是int-->char,则需要int + '0':
num + '0'
*/
printf("num = %d\n", num);
printf("num + '0' = %d\n", num + '0');
printf("num + '0' = %c\n", num + '0');
运行结果:
num = 7
num + '0' = 55
num + '0' = 7
字母char型+'a'与-'a'
同理数字char型+'0'/-'0',其实不管是字母char型还是数字char型,本质上都是char与int的互相转换
转换的好处可以用于hash的key
char ch_a = 'a';
printf("ch_a = %c\n", ch_a); // 'a'
printf("ch_a = %d\n", ch_a); // ascii
printf("ch_a - 'a' = %d\n", ch_a - 'a'); // char -> int
int num = 0;
printf("num = %d\n", num); // 0
printf("num + 'a' = %c\n", num + 'a'); // int -> char
运行结果:
ch_a = a
ch_a = 97
ch_a - 'a' = 0
num = 0
num + 'a' = a
atoi等接口使用
函数原型:
int atoi(const char *str );
函数功能:
把字符串转换成整型数。
参数str:
要进行转换的字符串
返回值:
每个函数返回 int 值,此值由将输入字符作为数字解析而生成。 如果该输入无法转换为该类型的值,则atoi的返回值为 0。
注意:
使用该函数时要注意atoi返回的是int类型,注意输入str的范围不要超出int类型的范围。
函数实现:
#include <stdio.h>
#include <stdbool.h>
int my_atoi(const char *src)
{
int s = 0;
bool isMinus = false;
while(*src == ' ') // 跳过空白符
{
src++;
}
if(*src == '+' || *src == '-')
{
if(*src == '-')
{
isMinus = true;
}
src++;
}
else if(*src < '0' || *src > '9') //如果第一位既不是符号也不是数字,直接返回异常值
{
s = 2147483647;
return s;
}
while(*src != '\0' && *src >= '0' && *src <= '9')
{
s = s * 10 + *src - '0';
src++;
}
return s * (isMinus ? -1 : 1);
}
int main()
{
int num;
char *str = "a123456";
num = my_atoi(str);
printf("atoi num is: %d \r\n", num);
return 0;
}