题目:
代码:
AddressSanitizer: heap-buffer-overflow,报错是这个,这是因为出现了字符串数组的越界访问
int judge(char ch)
{
if(ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u')
return 1;
else if(ch=='A'||ch=='E'||ch=='I'||ch=='O'||ch=='U')
return 1;
else
return -1;
}
char* reverseVowels(char* s)
{
int len=0;
for(int i=0;s[i]!='\0';i++)
len++;
int l=-1,r=len;
while(l<r)
{
l++;
while(judge(s[l])==-1&&s[l]!='\0')
l++;
r--;
while(judge(s[r])==-1&&r>0)///刚开始这里写了r>=0,所以会越界
r--;
if(l<r)
{
char ch=s[l];
s[l]=s[r];
s[r]=ch;
}
}
return s;
}
leetcode判定算法还是严格的,以前构思双指针遍历办法的时候总是忽略两个指针越界访问的问题,长个记性了。
再补充一个同样的问题,在做这种遍历的时候千万小心,尤其是从尾到头遍历,循环不能取0
58. 最后一个单词的长度
int lengthOfLastWord(char* s)
{
int n=0;
for(int i=0;s[i]!='\0';i++)
n++;
int len=0,i;
for(i=n-1;i>=0;i--)
if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
break;
for(int j=i;s[j]!=' '&&j>=0;j--)//这里也存在这个问题
但是j又必须访问到0位,所以加一行if判断
{
len++;
if(j==0)
break;
}
return len;
}