1.比较是否有等字符?
方法:开辟一个数组,大的数组空间,以ASCII码为索引,设置数组值,每次设置前判断是否已设置,如果是,说明有相等的,且知道是哪个字母相同。字母的ASCII码最大为122,所以数组空间至少122个。
用例:无论是比较同一个字符串或字符数组中是否有相同的字符,还是对比两个字符串之间是否有相同字符,都可参靠此方法;
实现:
方法:开辟一个数组,大的数组空间,以ASCII码为索引,设置数组值,每次设置前判断是否已设置,如果是,说明有相等的,且知道是哪个字母相同。字母的ASCII码最大为122,所以数组空间至少122个。
用例:无论是比较同一个字符串或字符数组中是否有相同的字符,还是对比两个字符串之间是否有相同字符,都可参靠此方法;
实现:
bool IsAllCharUnique(char *s)
{
char char_set[256] = {0};
int val = 0;
while(val = *s++)//1.赋值操作本身有返回值,返回赋值本身,这也是为什么赋值运算可以连续操作即a=b=c;2.字符串最后有NULL
{
if(char_set[val])
return false;
char_set[val] = 1;
}
return true;
}
注意:1.字符串结束符的使用;2.赋值运算返回值的使用;3.使用被判定字符ASCII码作为索引开辟数组记录字符出现的情况,是用空间换时间,较少了时间复杂度
2.将一个字符串颠倒顺序?
方法:使用连个指针,分别指向字符串头和尾,使用中间变量倒换,直至头指针的值不在小于尾指针的值;
实现:
void reverse(char *s)
{
char *t = s;
char tmp;
if(s)
{
while(*t)
t++;
t--;//上循环让t走到字符串尾部,指向了NULL,必须退回一个才能真正指向字符串的最后一个
while(s < t)
{
tmp = *s;
*s++ = *t;
*t-- = tmp;
}
}
}
注意:此处实参传入的是字符数组名,还是初始化为指向字符串的指针,会带来不同问题,后者会报错!(忽然想到,我这里所说的“初始化为指向字符串的指针”做实参报错,是因为它是字符串常量的指针,其内容是不允许被改变的!!!)
……(待续)