0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一些常见的C语言字符串操作

Q4MP_gh_c472c21 来源:嵌入式ARM 作者:嵌入式Linux 2020-12-24 16:31 次阅读

#字符串倒序输出

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

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

#include"stdio.h"

voidrechange_str(char*str)
{
inti,len;
chartmp;
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
",str);
rechange_str(str);
printf("%s
",str);
return(0);
}

程序输出

hello,world
dlrow,olleh

--------------------------------
Processexitedafter0.02841secondswithreturnvalue0
请按任意键继续...

#整型转字符串

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

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

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

#include"stdio.h"

char*sky_itoa(intvalue,char*str,unsignedintradix)
{
charlist[]="0123456789ABCDEF";
unsignedinttmp_value;
inti,j,k;
if(NULL==str){
returnNULL;
}
if(2!=radix&&8!=radix&&10!=radix&&16!=radix){
returnNULL;
}
i=0;
k=0;
if(radix==10&&value< 0) {
  tmp_value = (unsigned int)(0 - value);
  str[i++] = '-';
k=1;
}else{
tmp_value=(unsignedint)value;
}
do{
str[i++]=list[tmp_value%radix];
tmp_value/=radix;
}while(tmp_value);
str[i]='';
//翻转
chartmp;
for(j=k;j< (i+k)/2; j++) {
  tmp = str[j];
  str[j] = str[i+k-j-1];
  str[i+k-j-1] = tmp;
 }
 returnstr;
}

intmain(void)
{
inta=1254545;
charstr[100]={0};

printf("%s
",sky_itoa(a,str,2));
printf("%s
",sky_itoa(a,str,8));
printf("%s
",sky_itoa(a,str,10));
printf("%s
",sky_itoa(a,str,16));
return(0);
}

程序输出

100110010010010010001
4622221
1254545
132491

--------------------------------
Processexitedafter0.02963secondswithreturnvalue0
请按任意键继续...

#字符串复制

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

#include"stdio.h"

char*sky_strcpy(char*dst,constchar*str)
{
if(NULL==dst||NULL==str){
returnNULL;
}
char*ret=dst;
while(*str!=''){
*dst++=*str++;
}
returnret;
}

intmain(void)
{
charstr_1[100]="hello,world";
charstr[100]={0};

sky_strcpy(str,str_1);
printf("str_1:%s
",str_1);
printf("str:%s
",str);
return(0);
}

程序输出

str_1:hello,world
str:hello,world

--------------------------------
Processexitedafter0.03334secondswithreturnvalue0
请按任意键继续...

#字符串比较

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

#include"stdio.h"

intsky_strcmp(char*dst,char*str)
{
inti,len;
if(NULL==dst||NULL==str){
return0;
}
if(strlen(dst)!=strlen(str)){
return0;
}
len=strlen(dst);
for(i=0;i< len; i++) {
  if(*dst++!=*str++){
return0;
}
}
return1;
}

intmain(void)
{
charstr_1[100]="hello,world";
charstr_2[100]="hello,world";
charstr[100]="adfs";

printf("%d
",sky_strcmp(str_1,str));
printf("%d
",sky_strcmp(str_1,str_2));
return(0);
}

程序输出

0
1

--------------------------------
Processexitedafter0.02802secondswithreturnvalue0
请按任意键继续...

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

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

#include"stdio.h"

#defineCONVERT(c)(((c)>='A'&&(c)<= 'Z') ? ((c) - 'A' + 'a') : (c))
intsky_strcmp(char*dst,char*str)
{
inti,len;
if(NULL==dst||NULL==str){
return0;
}
if(strlen(dst)!=strlen(str)){
return0;
}
len=strlen(dst);
for(i=0;i< len; i++) {
   if(CONVERT(*dst)!=CONVERT(*str)){
return0;
}
dst++;
str++;
}
return1;
}

intmain(void)
{
charstr_1[100]="heLlo,world";
charstr_2[100]="hello,world";
charstr[100]="adfs";

printf("%d
",sky_strcmp(str_1,str));
printf("%d
",sky_strcmp(str_1,str_2));
return(0);
}

程序输出

0
1

--------------------------------
Processexitedafter0.04624secondswithreturnvalue0
请按任意键继续...

#memcpy函数实现

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

1、不考虑拷贝覆盖问题

#include"stdio.h"
#include"string.h"

void*sky_memecpy(void*dst,constvoid*str,intn)
{
if(NULL==dst||NULL==str||n<= 0) {
  returnNULL;
}
char*pdst=(char*)dst;
char*pstr=(char*)str;
while(n--){
*pdst++=*pstr++;
}
returndst;
}

intmain(void)
{
charstr_1[100]="heLlo,world";
charstr_2[100]="sdfsdfs";
sky_memecpy(str_2,str_1,strlen(str_1));
printf("%s
",str_2);
return(0);
}

程序输出

heLlo,world

--------------------------------
Processexitedafter0.02516secondswithreturnvalue0
请按任意键继续...

2、考虑拷贝覆盖问题

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

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

#include"stdio.h"
#include"string.h"

void*sky_memecpy_1(void*dst,constvoid*str,intn)
{
if(NULL==dst||NULL==str||n<= 0) {
   returnNULL;
}
char*pdst=(char*)dst;
char*pstr=(char*)str;
while(n--){
*pdst++=*pstr++;
}
returndst;
}

void*sky_memecpy(void*dst,constvoid*str,intn)
{
if(NULL==dst||NULL==str||n<= 0) {
   returnNULL;
}
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++;
}
}
returndst;
}

intmain(void)
{
charstr_1[100]="heLlo,world";
charstr_2[100]="heLlo,world";
sky_memecpy_1(str_1+1,str_1,strlen(str_1));
printf("%s
",str_1);

sky_memecpy(str_2+1,str_2,strlen(str_2));
printf("%s
",str_2);
return(0);
}

程序输出

hhhhhhhhhhhh
hheLlo,world

--------------------------------
Processexitedafter0.02773secondswithreturnvalue0
请按任意键继续...

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

#include"stdio.h"
#include"string.h"

void*sky_memecpy(void*dst,constvoid*str,intn)
{
if(NULL==dst||NULL==str||n<= 0) {
  returnNULL;
}
char*pdst=(char*)dst;
char*pstr=(char*)str;
while(n--){
printf("dst:%c--->str:%c
",*pdst,*pstr);
*pdst++=*pstr++;
}
returndst;
}

intmain(void)
{
charstr_1[100]="heLlo,world";
sky_memecpy(str_1+1,str_1,strlen(str_1));
printf("%s
",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

--------------------------------
Processexitedafter0.02575secondswithreturnvalue0
请按任意键继续...

初始的时候,dst指向 e 字符,str 指向h 字符,然后每次都是dst先移动,str再移动,就出现了dst被h字符所覆盖。好了,就这些内容,希望大家好好消化,这些代码对面试很有帮助。

责任编辑:xj
原文标题:面试必备!常见的C语言字符串操作
文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18274

    浏览量

    288341
  • C语言
    +关注

    关注

    180

    文章

    7528

    浏览量

    128398
  • 字符串
    +关注

    关注

    1

    文章

    550

    浏览量

    20105

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

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何提取串口接收字符串数组里的某个字符串

    条(有时候二十多条不定)响应字符串指令,我是用一个字符串数组来接收这些返回来的指令的。我现在只需要读取数组里的某条指令,应该怎么把它提取出来啊??有哪位前辈懂的,希望能提供点帮助。我找了好久找到
    发表于 04-22 06:05

    C语言字符串编译函数介绍

    在C语言中,字符串实际上是使用null字符O'终止的一维字符数组。因此,一个以null结尾的字符串,包含了组成
    的头像 发表于 03-07 16:18 226次阅读
    C<b class='flag-5'>语言</b><b class='flag-5'>字符串</b>编译函数介绍

    PSOC Creator 4.4中是否有一些设置可以阻止strtok操作

    我需要一些帮助才能开始使用这个功能。 我做了个简单的代码,意图用逗号作为分隔符来标记字符串。 我尝试在 PC 上模拟以下代码并将其改编为 PSoc5LP: [i]int 主要 () [i
    发表于 01-24 08:31

    labview扫描字符串怎么用

    LabVIEW 是一种流程化编程语言和开发环境,主要用于控制、测量和监测系统。在 LabVIEW 中,扫描字符串是一项常见的任务,它允许用户按照一定的模式从输入字符串中提取所需的信息。
    的头像 发表于 12-29 10:12 597次阅读

    labview扫描字符串怎么用

    LabVIEW是一种图形化编程语言,用于开发控制、测量和监控系统。虽然它主要用于工程和科学领域,但也可以用于处理文本和字符串。 在LabVIEW中,可以使用字符串处理函数来扫描字符串
    的头像 发表于 12-26 16:58 694次阅读

    labview中怎么对字符串中的进行实时处理

    LabVIEW是一种用于开发控制、测试和测量系统的可视化编程环境,它提供了许多处理字符串的功能。在LabVIEW中,可以使用不同的函数和工具来实时处理字符串。下面我将详细介绍一些常见
    的头像 发表于 12-26 14:12 542次阅读

    oracle判断字符串包含某个字符

    字符串操作是任何编程语言中都非常重要的一部分,Oracle数据库作为目前最常用的关系型数据库之一,也提供了丰富的字符串操作函数和方法。在本文
    的头像 发表于 12-06 09:53 5385次阅读

    oracle中拼接字符串函数

    , string2) 其中,string1 和 string2 是需要连接的字符串参数。 除了 CONCAT 函数,Oracle 还提供了一些其他的字符串拼接函数和操作符,这些函数和
    的头像 发表于 12-06 09:49 924次阅读

    c语言怎么用scanf输入字符串

    在C语言中,我们可以使用scanf函数来接收用户的输入。scanf函数有很多种用法,其中一种用法就是用来接收字符串。 要接收字符串,我们可以使用"%s"格式说明符。下面是一个简单的示例
    的头像 发表于 11-24 10:03 1043次阅读

    c语言字符串定义

    字符串的定义、初始化、操作常见问题。 字符串的定义和初始化 在C语言中,字符串被定义为一个
    的头像 发表于 11-24 10:02 846次阅读

    python怎么把字符串变成数字

    计算中的值。在一些应用场景中,需要将字符串转换为数字,以便进行数值计算、条件判断或数据处理等操作。在本文中,我们将详细探讨Python中字符串到数字的转换方法,并讨论其在实际应用中的
    的头像 发表于 11-22 09:47 1464次阅读

    java字符串转化为日期格式

    在Java中,字符串转化为日期格式是一个常见的需求。日期格式在处理时间相关的操作时非常重要,它可以用来表示一段时间的开始和结束,也可以用来计算时间差等。本文将详细介绍如何将一个字符串
    的头像 发表于 11-17 16:38 727次阅读

    c语言如何对比字符串是否相同?

    c语言如何对比字符串是否相同把一个字符串变量直接赋值给另个变量怎么实现
    发表于 11-02 07:45

    C++字符串string

    string是C++编程语言中的字符串。在C++中字符串处理可以使用c语言字符串形式char *,也可以使用string类格式。
    的头像 发表于 07-10 00:26 884次阅读
    C++<b class='flag-5'>字符串</b>string

    求助,有没有办法将字符串常量放入闪存中?

    我正在开发个有很多常量字符串的应用程序。例如: char *hello = \"hello world\"; 或者 if (strncmp(hello, \"
    发表于 06-12 06:18