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;
}
  1. 复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

  2. 复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

  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;
 }
posted @ 2022-10-31 16:51  胖白白  阅读(93)  评论(0编辑  收藏  举报