C语言面试题分类->字符串处理
1.strlen:计算字符串长度(不包含'\0')
实现想法:遍历字符串,直到'\0'结束
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //指针法
unsigned int mystrlenaddr(const char * str) //为什么使用const char,我们只计数不对原数据进行改变
{
int length = ; //长度初始化为0
while (*str++)
{
length++;
}
return length;
} void main()
{
char * str = "fengcong is fucking too handsome"; //32个
//printf("%d\n", strlen(str));
printf("%d\n", mystrlenaddr(str)); system("pause");
}
2.strcmp:比较字符串大小(一般用于字符串排序)
实现想法:依次从字符串开始一直找到不同的那个字符进行比较,得出大小
#include<string.h>
#include<stdio.h>
#include<stdlib.h> //掌握指针法
int mystrcmp(char const * str1, const char * str2)
{
while (*str1 == *str2 && *str1 != '') //一直找到两个字符串不同的地方
{
str1++;
str2++;
}
if (*str1 > *str2)
return ;
else if (*str1 < *str2)
return -;
else
return ;
} void main()
{
char * str = "feng1";
char * str1 = "feng2"; //printf("%d\n", strcmp(str, str1)); printf("%d\n", mystrcmp(str, str1)); system("pause");
}
3.strcpy:用于字符串复制(复制包含'\0')
实现想法:一直复制到'\0'结束
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h> //指针法
char * mystrcpyaddr(char * dest, const char * source)
{
if (dest == NULL || source == NULL)
{
return NULL; //如果目的操作或者源为空,那么久直接返回
} while (*dest++ = *source++) //装X写法
;
return dest;
} //下标法
char * mystrcpyindex(char * dest, const char * source)
{
if (dest == NULL || source == NULL)
{
return NULL; //如果目的操作或者源为空,那么久直接返回
}
int i = ;
while (source != '\0')
{
dest = source;
i++;
}
dest = source; //因为要把最后的\0拷贝过去
return dest;
} void main()
{
char * str = "fengcong is fucking too handsome";
char str1[]; //目的字符数组
//strcpy(str1, str);
//printf("%s\n", str1);
mystrcpyindex(str1, str);
printf("%s\n", str1); system("pause");
}
4.strstr:寻找母串中是否存在某个子串(稍难)
实现想法:依次比对
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //下标 法
char * mystrstrindex(char * const momstr, const char * const sonstr)//前者指针指向的数据可变,但是指针不可变,后者都不可变
{
int momlen = strlen(momstr); //母串的长度
int sonlen = strlen(sonstr); //子串的长度 for (int i = ; i < (momlen - sonlen); i++) //从0开始循环母串,到momlen-sonlen停止
{
int flag = ;
for (int j = ; j < sonlen; j++)
{ if (momstr[i + j] != sonstr[j])
{
flag = ;
break; //如果出现不相等就 退出循环,继续从下面一个寻找
}
}
if (flag)
{
return (&momstr);
}
}
return NULL;
} //指针法
char * mystrstraddr(char * const momstr, const char * const sonstr)
{
char * mstr = momstr; //母串 while (*mstr)
{
char * sstr = sonstr; //子串
char * momnowstr = mstr; //记录现在母串的位置
int flag = ;
while (*sstr != )
{
if (*sstr != *momnowstr || *momnowstr == '')
{
flag = ;
break;
}
momnowstr++;
sstr++;
}
if (flag)
{
return mstr;
} mstr++; //母串对比位置+1
}
return NULL;
} void main()
{
char * str = "fengcong is too fucking handsome";
//printf("%p", strstr(str, "fengcong"));
//printf("%p", mystrstrindex(str, "engcong"));
printf("%p", mystrstraddr(str, "some")); system("pause");
}
5.itoa:整数转字符串
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h> char * myitoa(int value, char * str)
{
char * pstr = str; //str本身不能改变,一会要返回str
if (value < )
{
*pstr = '-';
pstr++;
value *= -; //转变为正数处理
}
int wei = ; //数至少一位
int ivalue = value; //用于测试长度
while ((ivalue /= ) != )
{
wei++;
} pstr += wei-;
while (value % != )
{
*pstr-- = (value % )+'';
value /= ;
}
return str;
} void main()
{
int num = -;
char str[] = { }; printf("%s", myitoa(num, str)); system("pause");
}
6.atoi:字符串转整数(遇到非数字字符结束)
#include<stdlib.h>
#include<stdio.h>
#include<string.h> int myatoi(const char * str)
{
if (str == NULL)
{
return ;
}
int num = ; //需要返回的值
int flag = ; //记录正负号
if (*str == '-')
{
flag = -;
str++;
}
else if (*str == '+')
{
str++;
} while (*str >= '' && *str <= '')
{
num= (num * + (*str - ''));
str++;
} return num*flag;
} void main()
{
char str[] = "-57124";
int num = ; printf("%d\n",myatoi(str)); system("pause");
}
7.memcpy:拷贝某段内存
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
//下标法
void * mymemcpybyindex(void * dest, const void * sor, size_t len)
{
if (dest == NULL || sor == NULL)
{
return NULL;
}
for (int i = ; i < len; i++)
{
((char*)dest) = ((char*)sor);
}
return dest;
}
//指针法
void * mymemcpybyaddr(void * dest, const void * sor, size_t len)
{
if (dest == NULL || sor == NULL)
{
return NULL;
}
char * pdest = dest;
char * psor = sor;
char * plast = (char * )sor + len;
while (psor < plast)
{
*pdest++ = *psor++; }
return dest;
} void main()
{
char str[] = "fengcong is fucking too handsome";
char * pstr = (char[]) { }; //在栈上开辟一段内存 //printf("%s\n", memcpy(pstr, str, 32));
printf("%s\n", mymemcpybyaddr(pstr, str, )); system("pause");
}
8.memset:对指定内存每个字节赋某个值
#include<stdio.h>
#include<stdlib.h>
#include<memory.h> //下标法
void * mymemsetbyindex(void * dest, int val, size_t len)
{
if (dest == NULL)
{
return NULL;
}
if (len == )
{
return dest;
}
char * p = dest;
for (int i = ; i < len; i++)
{
p = val;
}
return dest;
} //指针法
void * mymemsetbyaddr(void * dest, int val, size_t len)
{
if (dest == NULL)
{
return NULL;
}
if (len == )
{
return dest;
}
char * p = dest;
char * plast = p + len;
while (p < plast)
{
*p++ = val;
}
return dest;
} void main()
{
char str[] = "fengcong is fucking too handsome";
//printf("%s\n", memset(str, 65, 8));
printf("%s\n", mymemsetbyaddr(str, , ));
system("pause");
}
9.memmove:和memcpy类似,但是memmove采用了中间空间,memcpy是直接拷贝
两者区别之处在于当拷贝地址重复的时候,结果不一样(比较代码可知)
#include<stdlib.h>
#include<stdio.h>
#include<string.h> char * myftoa(double db, char * str)
{
char * pstr = str;
//先判断 符号位
if (db < )
{
*pstr = '-';
db *= -; //转为正数处理
pstr++;
}
//整数部分
int zhengshu = (int)db;
int izhengshu = zhengshu; //牺牲于记录整数长度
int wei = ; //整数部分至少一位
while ((izhengshu /= ) != )
{
wei++;
}
pstr += wei - ;
for (int i = ; i < wei; i++)
{
*pstr-- = zhengshu % + '';
zhengshu /= ;
}
pstr += (wei+);
*pstr = '.';
pstr++;
//小数部分
double xiaoshu = db - (int)db;
for (int i = ; i < ; i++)
{
*pstr++ = (int)(xiaoshu * ) + '';
xiaoshu = xiaoshu * - (int)(xiaoshu * );
}
return str;
} void main()
{
double db = -2.11;
char str[] = { };
printf("%s\n", myftoa(db,str)); system("pause");
}
10.memchr:某段内存中寻找某个值
#include<stdio.h>
#include<stdlib.h>
#include<memory.h> void * mymemchar(void * buf, int val, size_t size)
{
if (buf == NULL)
{
return NULL;
}
char * p = buf;
char plast = p + size;
while (p < plast)
{
if (*p == val)
{
return p;
}
p++;
}
return NULL;
} void main()
{
char str[] = "fengcong is fucking too handsome";
printf("%s\n", mymemchar(str, 'g', )); system("pause");
}
11.memccpy:内存拷贝,直到一个值结束
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
//下标法
void * mymemccpybyindex(void * dest, const void * sor,int val, size_t len)
{
if (dest == NULL || sor == NULL)
{
return NULL;
}
for (int i = ; i < len; i++)
{
if( (((char*)dest) = ((char*)sor)) == val)
return dest;
}
return dest;
}
//指针法
void * mymemccpybyaddr(void * dest, const void * sor,int val, size_t len)
{
if (dest == NULL || sor == NULL)
{
return NULL;
}
char * pdest = dest;
char * psor = sor;
char * plast = (char *)sor + len;
while (psor < plast)
{
if ((*pdest++ = *psor++) == val)
return dest; }
return dest;
} void main()
{
char str[] = "fengcong is fucking too handsome";
char * pstr = (char[]) { }; //在栈上开辟一段内存
//printf("%s\n", memccpy(pstr,str,'s',32));
printf("%s\n", mymemccpybyaddr(pstr, str, 'f', )); system("pause");
}
12.memicmp:比较某段内存大小(一个字节一个字节比较,像strcmp)
注意:切不可用来比较整数,除非一字节整数,因为整数存储方式是高位高字节
#include<stdio.h>
#include<stdlib.h>
#include<memory.h> int mymemicmpbyaddr(const void * buf1, const void * buf2, size_t size)
{
char * p1 = buf1;
char * p2 = buf2;
int i = ;
while(*p1 == *p2 && i < size)
{
p1++;
p2++;
i++;
}
if (*p1 > *p2)
{
return ;
}
else if (*p1 < *p2)
return -;
else
return ; } void main()
{
char str[] = "fengcong is fucking too handsome";
char str1[] = "fengfeng is fucking too handsome"; printf("%d\n", mymemicmpbyaddr(str, str1, ));
system("pause");
}
C语言面试题分类->字符串处理的更多相关文章
- C语言面试题分类->指针
有关指针的经典面试题 C语言为何如此长寿并实用?C++为什么有那么多精彩?指针可以说是C/C++中的灵魂所在,虽然早期中pascal也有指针,但是和C/C++比起来不是一个级别的.今天为大家深入浅出的 ...
- C语言面试题分类->宏定义
1.写一个“标准”宏,这个宏输入两个参数并返回较小的一个 答:#define MIN(x, y) ((x)<(y)?(x):(y))//注意x,y要加括号,因为x,y如果有复合运算会出现问题. ...
- C语言面试题分类->回调
本文主要讲解如果实现回调,特别是在封装接口的时候,回调显得特别重要,我们首先假设有两个程序员在写代码,A程序员写底层驱动接口,B程序员写上层应用程序,然而此时底层驱动接口A有一个数据d需要传输给B,此 ...
- C语言面试题分类->链表
链表的创建,清空,插入,删除 typedef int (* __compfunc)(const void *, const void *); //Traverse list. Fast macro t ...
- C语言面试题分类->排序算法
1.选择排序. 每次将最小的数,与剩余数做比较.找到更小的,做交换. 时间复杂度:O(n²) 空间复杂度:O(1) 优缺点:耗时但内存空间使用小. void selectSort(int *p,int ...
- C语言面试题分类->位运算
1.不用临时变量交换两个整数. a = a ^ b; b = a ^ b; a = a ^ b; 2.实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如9的二进制是1001,则输出2. i ...
- 嵌入式开发—C语言面试题
嵌入式开发—C语言面试题 源地址:http://blog.csdn.net/xdx2ct1314/article/details/7358929 1. 用预处理指令#define 声明一个常数,用 ...
- 12个有趣的C语言面试题
摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int ma ...
- 转 C语言面试题大汇总
转 C语言面试题大汇总,个人觉得还是比较全地!!! \主 题: C语言面试题大汇总,个人觉得还是比较全地!!! 作 者: free131 (白日?做梦!) 信 誉 值: 100 ...
随机推荐
- CocosCreator脚本中向依赖的组件赋值后, 被依赖的组件没有取到值的问题!
问题描述: 两个节点parent&child(其中都包含脚本组件), parent脚本组件依赖了child组件, 节点关系如下图: parent脚本内容如下: child脚本内容如下: 预览时 ...
- 模拟实现库函数的atoi、atof和itoa
1.函数atoi atoi (表示 alphanumeric to integer)是把字符串转换成整型数的一个函数.广泛的应用在计算机程序和办公软件中.atoi( ) 函数会扫描参数 nptr字符串 ...
- (转载)C# 枚举 FlagsAttribute用法
这是读过几篇文章后发现整理的最完整的一篇文章 转载地址:枚举特性FlagsAttribute的用法 先看官方的解释:指示可以将枚举作为位域(即一组标志)处理. 看起来并不好理解,到底什么是作为位域处理 ...
- vim 使用学习操作
1 跳转 命令 作用 h 光标向左移动 l 光标向右移动 j 光标向上移动 k 光标向下移动 w 移动光标到下一个单词开头. e 移动光标到下一个单词结尾 b 移动光标到上一个单词. 0 移动光标到本 ...
- haproxy代理配置段参数设定
代理配置段:有四个配置段 default:设定默认参数, frontenf:前端服务器的设定 backend:后端服务器的设定 listening:是设定前端和后端一一对应的设定 参数: 1bind: ...
- 小程序-组件component和模版template的选择和使用
小程序提供了组件component和模版template那什么时候 选择哪一个使用呢?我总结了一下 template主要是模版,对于重复的展示型模块进行展示,其中调用的方法或者数据data都是需要引用 ...
- Vue面试中,经常会被问到的面试题/Vue知识点整理
一.对于MVVM的理解? MVVM 是 Model-View-ViewModel 的缩写.Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑.View 代表UI 组件,它负责将数 ...
- Shell编程-条件测试 | 基础篇
什么是Shell Shell是一个命令解释器,它会解释并执行命令行提示符下输入的命令.除此之外,Shell还有另一个功能,如果要执行多条命令,它可以将这组命令存放在一个文件中,然后可以像执行Linux ...
- Linux-day1-pdf课件
1.掌握Linux目录结构 2.掌握基础文件操作指令 3.vim常用操作命令 4.Linux用户和组
- 【ORM框架】Spring Data JPA(一)-- 入门
本文参考:spring Data JPA入门 [原创]纯干货,Spring-data-jpa详解,全方位介绍 Spring Data JPA系列教程--入门 一.Spring Data JPA介 ...