网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

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

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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
外国解说4字评价孙颖莎一轮游!WTT最差战绩诞生,李隼邱贻可发愁

外国解说4字评价孙颖莎一轮游!WTT最差战绩诞生,李隼邱贻可发愁

嘴炮体坛
2024-11-21 18:18:56
四川女干部出轨后续,照片曝光身份被扒,事发原因透露,当地介入

四川女干部出轨后续,照片曝光身份被扒,事发原因透露,当地介入

飞花文史
2024-11-21 16:12:16
马斯克语出惊人,直言不讳:现在只有特斯拉是中国新能源车的对手

马斯克语出惊人,直言不讳:现在只有特斯拉是中国新能源车的对手

小企鹅侃世界
2024-11-20 14:56:32
中国芯片大举出口,卷死美国芯片

中国芯片大举出口,卷死美国芯片

华山穹剑
2024-11-21 19:44:50
新加坡国务资政李显龙将访华

新加坡国务资政李显龙将访华

新京报
2024-11-22 15:19:22
24岁女孩指甲惊现“玛莎拉蒂”标志,医生提醒:赶紧切!

24岁女孩指甲惊现“玛莎拉蒂”标志,医生提醒:赶紧切!

大象新闻
2024-11-21 13:58:23
新神雕侠侣:忍过了小龙女的“网红脸”,实在忍不了杨过的扮演者

新神雕侠侣:忍过了小龙女的“网红脸”,实在忍不了杨过的扮演者

八卦南风
2024-11-22 10:52:05
2010年,湖北一省厅夫人被6名警察当众殴打16分钟,最后怎么样了

2010年,湖北一省厅夫人被6名警察当众殴打16分钟,最后怎么样了

星辰人生
2023-10-13 23:10:20
马拉松“能量胶”男女已找到,东西已吃完,文体局回应大快人心!

马拉松“能量胶”男女已找到,东西已吃完,文体局回应大快人心!

历史看阿敞
2024-11-21 16:51:15
公安部:2025年1月起,60岁以上老年人增加2种驾照,多开4种车型

公安部:2025年1月起,60岁以上老年人增加2种驾照,多开4种车型

电动车的那些事儿
2024-11-21 17:58:49
央媒“辟谣”降温股市!11月22日,今日凌晨的四大消息全面发酵!

央媒“辟谣”降温股市!11月22日,今日凌晨的四大消息全面发酵!

风口招财猪
2024-11-22 00:40:02
黄晓明不跟叶珂分手?博主“妖怪”自曝收到黄指示,不能再骂叶珂

黄晓明不跟叶珂分手?博主“妖怪”自曝收到黄指示,不能再骂叶珂

小咪侃娱圈
2024-11-22 11:28:16
孙颖莎2-3陈幸同!可怕不是输球,而是赛后马琳这番话,情有可原

孙颖莎2-3陈幸同!可怕不是输球,而是赛后马琳这番话,情有可原

阿伧说事
2024-11-21 15:29:41
云南知名房产大佬去世,仅42岁!当地网友对其赞誉不断,死因曝光

云南知名房产大佬去世,仅42岁!当地网友对其赞誉不断,死因曝光

火山诗话
2024-11-22 09:47:47
美国防长被中方拒绝后,第一时间跑去南海,这场戏演给谁看?

美国防长被中方拒绝后,第一时间跑去南海,这场戏演给谁看?

老高风云
2024-11-21 15:22:51
奶奶临终前分财产,收养的大伯主动离开,我父亲拦住:我有话说

奶奶临终前分财产,收养的大伯主动离开,我父亲拦住:我有话说

农村情感故事
2024-11-19 06:54:21
《黑神话》DLC连文件夹都没建?冯骥: 录完就后悔了

《黑神话》DLC连文件夹都没建?冯骥: 录完就后悔了

游民星空
2024-11-22 09:03:05
大众,撑不住了!

大众,撑不住了!

华商韬略
2024-11-22 10:21:48
突发!大批日本AV女优香港被捕,背后黑幕被揭开!

突发!大批日本AV女优香港被捕,背后黑幕被揭开!

港港地
2024-11-22 09:01:48
中国电动车,大量堆积在欧洲港口,美欧嘲讽:产能过剩的恶果!

中国电动车,大量堆积在欧洲港口,美欧嘲讽:产能过剩的恶果!

小蘑菇壹号
2024-11-20 12:06:57
2024-11-22 15:44:49
职坐标在线
职坐标在线
一站式IT培训就业服务平台
337文章数 4关注度
往期回顾 全部

科技要闻

美车企请求特朗普:让我们继续卖电动车吧

头条要闻

夫妇担保贷款43万成主贷人 妻子与银行交涉遇车祸身亡

头条要闻

夫妇担保贷款43万成主贷人 妻子与银行交涉遇车祸身亡

体育要闻

今年的西部,局面很开放

娱乐要闻

制片人力挺王宝强,怒斥对方贪得无厌

财经要闻

沪指失守3300点 两市超4900股下跌

汽车要闻

几乎无短板的内饰 比亚迪夏仍旧拥有爆款品质

态度原创

亲子
旅游
数码
手机
公开课

亲子要闻

妈妈和爸爸想吃萌娃的棒棒糖,结果双标儿子做法令人出乎意料。

旅游要闻

莲花山滑雪场向摄影界、新闻界免费开放!

数码要闻

499元的FIIL GS Links,拉开了AI耳机普及的序幕

手机要闻

三星介绍 Project Infinity 攻防演练项目,高效修复 Galaxy 漏洞

公开课

一块玻璃,如何改变人类世界?

无障碍浏览 进入关怀版