字符串问题:
1,字符串比较
2,字符串转数字,例如“123”->123,“123a4”->123,且开头可以是空格,正负号
3,数字转字符串,例如1234->“1234”
4,两个字符串合并,例如“abc”,“xyz”->“abcxyz”
针对以上四类问题,我们接下来一一解答。
针对问题一,字符串比较问题
注意:一个字符一个字符的进行比较;其次,只要在比较的一对中分出大小则返回这个结果,否则,就是相等。
//字符串比较,如果第一个大返回>0的数字,相等返回0,第一个小返回<0的数字
int Mystrcmp(const char *str1,const char *str2)
{
assert(str1!=NULL && str2!=NULL);
if(str1 == NULL || str2 == NULL)
{
return 0;
}
int tmp;
while((tmp=*str1-*str2)==0 && *str1!='\0' && *str2!='\0')
{
str1++;
str2++;
}
return tmp;
}
int main()
{
printf("%d\n",Mystrcmp("abc","x"));
printf("%d\n",Mystrcmp("abc","abc"));
printf("%d\n",Mystrcmp("abc","abb"));
return 0;
}
-23
0
1
请按任意键继续. . .
针对问题二,字符串转数字
注意:遇到数字即结束(这与标准函数一致,也可不结束),字符串开头可以是空格,正负号。
int Myatoi(const char *str)
{
assert(str!=NULL);
if(str == NULL)
return 0;
int tmp = 0;
int flag = 1;
while(*str==' ')
{
str++;
}
if(*str == '-')
{
flag = -1;
str++;
}
if(*str == '+')
{
flag = 1;
str++;
}
while(isdigit(*str))
{
tmp = tmp*10+(*str-'0');
str++;
}
return flag*tmp;
}
int main()
{
printf("%d\n",Myatoi("123"));
printf("%d\n",Myatoi("-123a4"));
printf("%d\n",Myatoi(" +123"));
return 0;
}
123
-123
123
请按任意键继续. . .
针对问题三,数字转字符串
void Myitoa(char *buf,int n)
{
char str[10] = "";
int i=0;
int len=0;
if(buf == NULL)
{
return;
}
while(n)
{
buf[i++] = (n%10)+'0';
n = n/10;
}
buf[i] = 0;
while(1)
{
i--;
if(str[len-i-1] == 0)
break;
buf[i] = str[len-i-1];
}
}//有待运行
针对问题四,两个字符串合并
注意:找到一字符串的尾巴最重要,简单说就是找’\0‘,再将另一字符串覆盖其’\0‘即可,最后返回指针(此时的指针不能返回,因为此时的指针已经在该字符数组的尾部,若强制返回会出错,正确的方法就是在一开始就保存其指针开始的地址)。
char *Mystrcat(char *des,const char *src)
{
assert(des != NULL && src != NULL);//断言
if(des==NULL || src==NULL)
return NULL;
char *p = des;//保存指针位置
while(*des != '\0')//寻找指针尾巴
{
des++;
}
while(*des++ = *src++);
return p;
}
总结:
字符串的四个问题,就是上面所写的,虽然有库函数可以被我们所调用,但是总不能连机理都不懂吧,其实所解决的问题不难,但就靠自己的双手去打造更完美的代码啦!