面试常见的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字符所覆盖。

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

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SecureCRT远程登录ubuntu

SecureCRT远程登录ubuntu 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 用secureCRT连接Ubuntu是出现远程系统拒绝访问。。经过一翻研究才知道Ubuntu上没有ssh.以下为连接过程。 1. 首先要明白什么是ssh? 可以把ssh看做是telnet的加强版&#xff0…

HttpHandler:给指定路径下的图片添加水印显示

圣诞节&#xff0c;25日&#xff0c;要交ACCP5.0认证的项目&#xff0c;其中有这样一个要求&#xff1a;书店的所有图书的封面放在了\images\convers\下面&#xff0c;要求所有引用这一路径下的图片都添加书店的店名水印图片。就是说拦截Http请求了&#xff0c;自然想到HttpHan…

随机选择算法

如何求解无序数组中第k大的数&#xff1f; 问题&#xff1a;将数组划分为两个子集,元素个数分别为n1,n2,两个子集各自元素之和分别为S1,S2,使|S2-S1|尽可能大&#xff0c;使|n1-n2|尽可能小。求|S2-S1|。 分析&#xff1a;仅寻找数组中第n/2大的数&#xff0c;将数组划分为两个…

Linux 下的复制命令,这几个比较靠谱

平时我们使用Linux复制命令的时候&#xff0c;一般使用 cp命令&#xff0c;但是cp 命令性能比较令人担忧使用tar 命令来拷贝大量文件通过对比下面的几个命令&#xff0c;在拷贝比较多而且比较大的文件的话&#xff0c;用git clone 比较靠谱&#xff0c;特别是复制代码库&#x…

C语言——标准库

C语言标准库 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 <assert.h> 断言 <ctype.h> 字符类测试 <errno.h> &#xff08;部分&#xff09;库函数抛出的错误代码 <float.h> 浮点数运算 <limits.h> …

MOSS自动备份

MOSS自动备份&#xff0c;根据当前时间生成不同的文件名&#xff1a;"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\bin\stsadm" -o backup -url http://it.saicmotor.com:80 -filename D:\ECPe_backup\%date:~0,10%_it.saicmotor.com.…

Mendeley文献管理软件使用介绍

<!DOCTYPE html>New DocumentMendeley 是一款免费的跨平台文献管理软件&#xff0c;同时也是一个在线的学术社交网络平台。Mendeley 对 PDF、Bibtex 的支持非常好&#xff0c;可以直接导出 Bibtex 格式&#xff0c;还可以直接导入zotero数据库&#xff0c;决定了其兼容性…

过拟合问题——正则化方法

看了很多资料&#xff0c;本身想放一个正则化的概念的&#xff0c;实在不敢放&#xff0c;怕吓跑一堆人&#xff0c;所以&#xff0c;将就吧。首先&#xff0c;我们知道正则化&#xff08;Regularization&#xff09;是解决过拟合问题的&#xff0c;简单来说&#xff0c;过拟合…

CentOS 8明年正式停止维护,以后再也不会有免费的RHEL了!

CentOS 8 明年正式停止维护&#xff0c;以后再也不会有免费的 RHEL 了!CentOS 是 Community Enterprise Operating System&#xff08;社区企业操作系统&#xff09;的首字母缩写&#xff0c;是 100&#xff05; 重建的 RHEL&#xff08;红帽企业 Linux&#xff09;。尽管 RHEL…

Linux C标准

Linux下C标准 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、ANSI C ANSI C的目标是为各种操作系统上的C程序提供可移植性保证&#xff08;如Linux与windows之间&#xff09;。 ISO C标准定义的头文件 <assert.h> 验证程序断言 <signa…

Python sqlalchemy orm 多外键关联

多外键关联 注&#xff1a;在两个表之间进行多外键链接 如图&#xff1a; 案例&#xff1a; # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, ForeignKey, String, Column# 调用基类Base from sqlalchemy.ext.declarative import dec…

查找含有特定字符的存储过程

select p.name, m.definition from sys.procedures p inner join sys.sql_modules m on p.object_id m.object_idwhere m.definition like %150% 感谢怡红公子

将DataFrame格式的数据存入到mysql数据库中

因为最近频繁操作数据库&#xff0c;特别是写入数据比较麻烦。在DataFrame格式或者是Series格式的数据处理之后&#xff0c;总是会面临写入数据&#xff0c;迫不得已只能进行格式转换&#xff0c;搜索过程中发现了to_sql&#xff08;&#xff09;函数&#xff0c;就百度了用法&…

从小米智能家居入手,揭秘物联网关键技术

物联网已不知不觉融入我们的生活中给我们带来便捷&#xff0c;比如&#xff0c;智能门锁、ETC 电子自动收费系统等&#xff0c;一开始感觉还挺很新奇的&#xff0c;现在也习以为常了。那到底什么是物联网&#xff1f;可能很多人还挺蒙圈的。所谓物联网&#xff0c;最终目的就是…

centos清除dns cache.

# /etc/init.d/nscd restart# service nscd restart# service nscd reload# nscd -i hosts https://www.2daygeek.com/flush-clear-dns-cache-on-ubuntu-centos-debian-fedora-mint-rhel-opensuse/# f转载于:https://www.cnblogs.com/jhj117/p/8335781.html

Linux开发初步

Linux开发初步 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、库函数与系统调用 1、系统调用函数和库函数 库函数是一些完成特定功能的函数&#xff0c;一般由某个标准组织制作发布&#xff0c;并形成一定的标准。使用库函数编写的函数一般可以应…

Orange——The Data

The Data 这个部分描述的是怎样在Orange上加载数据。我们也将展示如何探索数据&#xff0c;发现一些基本统计特性&#xff0c;怎么数据取样。 Data Input Orange可以读取本机以制表符分隔的格式的文件&#xff0c;也可以从任何主要的标准电子表格文件类型加载数据&#xff0…

[转载]VirtualBox网络配置详解

标题: [原创]VirtualBox网络配置详解来自 http://www.linuxsir.org/bbs/showthread.php?p1800679#post1800679 欢迎转载, 转载请注明作者, 谢谢下面简单介绍一下Test-bed Environment:Host : 偶的本本OS : Arch Linux (Kernel Version 2.6.20) 已安装uml_utilities(包含tunctl…

工作4年工资8K,还有什么理由不努力?

—— 提问发哥&#xff0c;我现在还是从事裸机开发&#xff0c;51单片机&#xff0c;会点arm&#xff0c;但没有用arm真正做完整开发的经验&#xff0c;细想感觉自己会的不是很多&#xff0c;薪资提不上去&#xff0c;想做更高级点的工作&#xff0c;虽然自学点&#xff0c;到没…

内存管理函数

内存管理函数 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、 动态申请内存 1、 malloc/free ——动态分配内存和释放内存 &#xff08;1&#xff09;函数原型 void *malloc(size_tsize); void free(void *str); &#xff08;2&#xff09;函数参…