原标题:面试必备——常见的C语言字符串操作

面试中常见的C语言字符串操作,快来看看,是否对你有帮助!

字符串倒序输出

实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里需要注意,不需要考虑len是奇数还是偶数的问题。

如果len是奇数,最后一个字符就不需要倒序,如果是偶数,最后两个字符就倒序。

#include "stdio.h"

void rechange_str(char *str)

{

int i, len;

char tmp;

if (NULL == str) {

return ;

}

len = strlen(str);

for (i = 0; i < len/2; i ++) {

tmp = str[i];

str[i] = str[len-i-1];

str[len-i-1] = tmp;

}

}

int main(void)

{

char str[20] = "hello,world";

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

rechange_str(str);

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

return (0);

}

程序输出

hello,world

dlrow,olleh

--------------------------------

Process exited after 0.02841 seconds with return value 0

请按任意键继续. . .

整型转字符串

实现逻辑,每个整数看其转换进制,从个位到十位百位都可以通过%操作加上/操作获得,再用一个字符数组保存0-F。

用个位数对应值转为字符,注意转换出的字符串是反向的,还要考虑传入的若是负数如何处理,再用翻转字符串完成最后整个操作。

下面这段代码需要好好研究一下,最好自己运行试试。

#include "stdio.h"

char *sky_itoa(int value, char *str, unsigned int radix)

{

char list[] = "0123456789ABCDEF";

unsigned int tmp_value;

int i, j, k;

if (NULL == str) {

return NULL;

}

if (2 != radix && 8 != radix && 10 != radix && 16 != radix) {

return NULL;

}

i = 0;

k = 0;

if (radix == 10 && value < 0) {

tmp_value = (unsigned int)(0 - value);

str[i++] = '-';

k = 1;

} else {

tmp_value = (unsigned int)value;

}

do {

str[i++] = list[tmp_value%radix];

tmp_value /= radix;

} while(tmp_value);

str[i] = '\0';

//翻转

char tmp;

for (j = k; j < (i+k)/2; j++) {

tmp = str[j];

str[j] = str[i+k-j-1];

str[i+k-j-1] = tmp;

}

return str;

}

int main(void)

{

int a = 1254545;

char str[100] ={0};

printf("%s\n",sky_itoa(a,str,2));

printf("%s\n",sky_itoa(a,str,8));

printf("%s\n",sky_itoa(a,str,10));

printf("%s\n",sky_itoa(a,str,16));

return (0);

}

程序输出

100110010010010010001

4622221

1254545

132491

--------------------------------

Process exited after 0.02963 seconds with return value 0

请按任意键继续. . .

字符串复制

实现逻辑,逐个赋值直到遇到'\0'停止即可。

#include "stdio.h"

char *sky_strcpy(char *dst, const char *str)

{

if (NULL == dst || NULL == str) {

return NULL;

}

char *ret = dst;

while (*str != '\0') {

*dst ++ = *str ++;

}

return ret;

}

int main(void)

{

char str_1[100] = "hello,world";

char str[100] ={0};

sky_strcpy(str,str_1);

printf("str_1:%s\n",str_1);

printf("str:%s\n",str);

return (0);

}

程序输出

str_1:hello,world

str:hello,world

--------------------------------

Process exited after 0.03334 seconds with return value 0

请按任意键继续. . .

字符串比较

1、正常比较是否相同 实现逻辑,判断字符串长度是否相同,若相同逐个比较字符是否相同

#include "stdio.h"

int sky_strcmp(char *dst, char *str)

{

int i, len;

if (NULL == dst || NULL == str) {

return 0;

}

if (strlen(dst) != strlen(str)) {

return 0;

}

len = strlen(dst);

for (i = 0; i < len; i++) {

if (*dst++ != *str++) {

return 0;

}

}

return 1;

}

int main(void)

{

char str_1[100] = "hello,world";

char str_2[100] = "hello,world";

char str[100] = "adfs";

printf("%d\n",sky_strcmp(str_1,str));

printf("%d\n",sky_strcmp(str_1,str_2));

return (0);

}

程序输出

0

1

--------------------------------

Process exited after 0.02802 seconds with return value 0

请按任意键继续. . .

2、忽略大小写字符串比较

实现逻辑,在比较字符时可以将其统一转换为大写或小写,然后再进行比对即可,和正常对比无其他不同

#include "stdio.h"

#define CONVERT(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) - 'A' + 'a') : (c))

int sky_strcmp(char *dst, char *str)

{

int i, len;

if (NULL == dst || NULL == str) {

return 0;

}

if (strlen(dst) != strlen(str)) {

return 0;

}

len = strlen(dst);

for (i = 0; i < len; i++) {

if (CONVERT(*dst) != CONVERT(*str)) {

return 0;

}

dst ++;

str ++;

}

return 1;

}

int main(void)

{

char str_1[100] = "heLlo,world";

char str_2[100] = "hello,world";

char str[100] = "adfs";

printf("%d\n",sky_strcmp(str_1,str));

printf("%d\n",sky_strcmp(str_1,str_2));

return (0);

}

程序输出

0

1

--------------------------------

Process exited after 0.04624 seconds with return value 0

请按任意键继续. . .

memcpy函数实现

实现逻辑,主要就是逐个赋值即可完成

1、不考虑拷贝覆盖问题

#include "stdio.h"

#include "string.h"

void *sky_memecpy(void *dst, const void *str, int n)

{

if (NULL == dst || NULL == str || n <= 0) {

return NULL;

}

char *pdst = (char *)dst;

char *pstr = (char *)str;

while (n --) {

*pdst ++ = *pstr ++;

}

return dst;

}

int main(void)

{

char str_1[100] = "heLlo,world";

char str_2[100] = "sdfsdfs";

sky_memecpy(str_2,str_1,strlen(str_1));

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

return (0);

}

程序输出

heLlo,world

--------------------------------

Process exited after 0.02516 seconds with return value 0

请按任意键继续. . .

2、考虑拷贝覆盖问题

拷贝覆盖是我们在拷贝字符串的时候需要注意的一个问题,我下面的示例程序,使用第一个函数的时候,就出现了问题,使用第二个函数就没有出现问题。

原因是,我们源字符串和目的字符串的地址都是一样的,我们希望把字符串往后移动一个位置,但是实际上出现了问题。

#include "stdio.h"

#include "string.h"

void *sky_memecpy_1(void *dst, const void *str, int n)

{

if (NULL == dst || NULL == str || n <= 0) {

return NULL;

}

char *pdst = (char *)dst;

char *pstr = (char *)str;

while (n --) {

*pdst ++ = *pstr ++;

}

return dst;

}

void *sky_memecpy(void *dst, const void *str, int n)

{

if (NULL == dst || NULL == str || n <= 0) {

return NULL;

}

char *pdst = (char *)dst;

char *pstr = (char *)str;

if (pdst > pstr && pdst < pstr + n) {

pdst = pdst + n - 1;

pstr = pstr + n - 1;

while (n --) {

*pdst -- = *pstr --;

}

} else {

while (n --) {

*pdst ++ = *pstr ++;

}

}

return dst;

}

int main(void)

{

char str_1[100] = "heLlo,world";

char str_2[100] = "heLlo,world";

sky_memecpy_1(str_1+1,str_1,strlen(str_1));

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

sky_memecpy(str_2+1,str_2,strlen(str_2));

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

return (0);

}

程序输出

hhhhhhhhhhhh

hheLlo,world

--------------------------------

Process exited after 0.02773 seconds with return value 0

请按任意键继续. . .

针对上面的拷贝覆盖问题,单独写了一个测试程序

#include "stdio.h"

#include "string.h"

void *sky_memecpy(void *dst, const void *str, int n)

{

if (NULL == dst || NULL == str || n <= 0) {

return NULL;

}

char *pdst = (char *)dst;

char *pstr = (char *)str;

while (n --) {

printf("dst:%c--->str:%c\n",*pdst,*pstr);

*pdst ++ = *pstr ++;

}

return dst;

}

int main(void)

{

char str_1[100] = "heLlo,world";

sky_memecpy(str_1+1,str_1,strlen(str_1));

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

return (0);

}

程序输出

dst:e--->str:h

dst:L--->str:h

dst:l--->str:h

dst:o--->str:h

dst:,--->str:h

dst:w--->str:h

dst:o--->str:h

dst:r--->str:h

dst:l--->str:h

dst:d--->str:h

dst: --->str:h

hhhhhhhhhhhh

--------------------------------

Process exited after 0.02575 seconds with return value 0

请按任意键继续. . .

初始的时候,dst指向 e 字符,str 指向h 字符,然后每次都是dst先移动,str再移动,就出现了dst被h字符所覆盖。

好了,就这些内容,希望大家好好消化,这些代码对面试很有帮助。

学习IT相关内容,找”职坐标在线“返回搜狐,查看更多

责任编辑:

c语言字符串的一般操作有,面试必备——常见的C语言字符串操作相关推荐

  1. c++中的new_面试中常见的C语言与C++区别的问题

    C和C++的区别 C语言是一种结构化语言,其偏重于数据结构和算法,属于过程性语言C++是面向对象的编程语言,其偏重于构造对象模型,并让这个模型能够契合与之对应的问题.其本质区别是解决问题的思想方法不同 ...

  2. pythonexcel操作总结_python中常见关于Excel表格读写操作

    最近在写项目,刚好要运用到excel表格的一些读写,顺便总结一下我以前学过的几个关于表格的操作.在写项目中,经常会见到页面中数据导出到表格中,同时,也会有经常在表格中填写测试用例,然后获取数据来做自动 ...

  3. 面试必备常见存储引擎与锁的分类

    MySQL的四大常见存储引擎 谈到 MyISAM 和 InnoDB 了我们先来了解一下什么是存储引擎吧. MySQL 中的数据用各种不同的技术存储在文件(或者内存)中,这些技术中的每一种技术都使用不同 ...

  4. 10万字C语言入门手册,历时三个月,详细的C语言教程终于出炉了,给你全新C语言入门体验

    C语言是一种非常流行的编程语言,它是许多现代编程语言的基础. 什么是计算机? 计算机是一种用于存储.处理.和输出数据的电子设备.它通过程序控制和数学算法来实现数据处理.计算机通过输入设备(如键盘.鼠标 ...

  5. 面试常见的C语言字符串操作

    #字符串倒序输出 实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里需要注意,不需要考虑len是奇数还是偶数的问题. 如果len是奇数,最后一个字符就不需要倒序,如果是 ...

  6. c语言字符串函数难题,一些常见的C语言字符串操作

    #字符串倒序输出 实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里需要注意,不需要考虑len是奇数还是偶数的问题. 如果len是奇数,最后一个字符就不需要倒序,如果是 ...

  7. c语言编程 遍历字符串,请教大家一个C语言面试的编程题目 C语言:循环执行让用户输入一串字符串,如123456789......

    导航:网站首页 > 请教大家一个C语言面试的编程题目 C语言:循环执行让用户输入一串字符串,如123456789... 请教大家一个C语言面试的编程题目 C语言:循环执行让用户输入一串字符串,如 ...

  8. c语言生命字符串,常见的C语言字符串操作

    原标题:常见的C语言字符串操作 #字符串倒序输出 实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里需要注意,不需要考虑len是奇数还是偶数的问题. 如果len是奇数, ...

  9. 这些常见的C语言字符串操作面试题,被问到了吗?

    关注.星标公众号,直达精彩内容 来源:网络素材 整理:李肖遥 字符串倒序输出 实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里需要注意,不需要考虑len是奇数还是偶数 ...

最新文章

  1. 伯克利AI研究院:强化学习是GPT2等自回归语言模型弥补不足的良方?
  2. spring-xml实现aop-通知的种类
  3. 微软 SQL Server 2019 将免费支持 Java;Rancher Labs获2500万美元融资;腾讯云进军日本市场……...
  4. 令人迷惑的硬币翻转(洛谷P1146题题解,Java语言描述)
  5. python内置方法怎么使用_python中的常用内置方法
  6. mysql 数据库授权
  7. mysql-8.0.16-winx64详细安装教程
  8. SVM入门(一)至(三)
  9. 华为hcip认证题库在哪找?HCIP如何考取?
  10. JavaScript算术运算中前加加与后加加
  11. OMNeT 例程 Tictoc13 学习笔记
  12. UEFI下的Gmac驱动实现
  13. 使用For循环写出99乘法表
  14. clk_get函数介绍
  15. npm下载包,npm常用包下载记录,npm包大全
  16. Unity3D官方推荐教程roll a bal案例
  17. 双软件认证的两项税收优惠政策是什么?
  18. 固定资产YTD折旧额SQL
  19. 提高电脑运行速度有高招
  20. c 调用易语言dll字节集,易语言教程指针到字节集及dll调用

热门文章

  1. web安全攻击方法流量分析
  2. ElasticSearch学习宝典
  3. webApp屏幕适配
  4. C# StreamReader
  5. 区块链技术开发公司谈区块链APP落地的趋势
  6. android+背景+网络图片,android背景图片平铺
  7. 模式的简史和形而上学
  8. 手机经常性很烫?又是吃电怪兽?Android DrainerBot来袭
  9. 虚拟手机服务器,华为发布"鲲鹏云手机":基于云服务器,具有虚拟手机功能...
  10. jacob.comfailexception:cant get objecct clsid from progid