#字符串倒序输出
实现逻辑,通过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】欢迎添加关注!文章转载请注明出处。
-
嵌入式
+关注
关注
5068文章
19008浏览量
303016 -
C语言
+关注
关注
180文章
7597浏览量
136121 -
字符串
+关注
关注
1文章
577浏览量
20485
原文标题:面试必备!常见的C语言字符串操作
文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论