leetcode——剑指offer58“左旋字符串”
【问】
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
【解】
char* reverseLeftWords(char* s, int n)
{
int len = strlen(s);
//另一种写法:char *rev=(char*)malloc(sizeof(char)*(len+1));
//+1为字符串末尾的/0留出位置!!!
char *rev=(char *)calloc(len+1,sizeof(char));
int a = len-n;
int b = n;
int i = 0;
//错解:for( int i = 0; i < a; i++)————i在下一个for循环也要用,不能在for内声明,应在for外单独声明
for(i = 0; i < a; i++)
{
rev[i] = s[b];
b++;
}
for(int j = 0; j < n; j++)
{
rev[i] = s[j];
i++;
}
return rev;
}
【笔记】
1.编译出错——int i
【错】
for(int i = 0; i < a; i++)
solution.c: In function ‘reverseLeftWords’
Line 18: Char 13: error: ‘i’ undeclared (first use in this function) [solution.c]
rev[i] = s[j];
^
【改】
int i = 0;
for(i = 0; i < a; i++)
i在下一个for循环也要用,不能在for内声明,应在for外单独声明
2. 执行出错——数组大小定义过小,导致访问越界
【错】
char *rev=(char)malloc(sizeof(char)*(len+1));
ERROR: AddressSanitizer: heap-buffer-overflow on address …
【改】
01:
#define MAX_CONTAIN 10001
char *rev=(char)malloc(sizeof(char)*(len+1));
02:
char *rev=(char )calloc(len+1,sizeof(char));
//char *rev=(char)malloc(sizeof(char)(len+1));
03:
int len = 0;
if(s[0]==’\0’|| n<=0)
return s;
len = strlen(s); //统计s长度
char *rev=(char)malloc(sizeof(char)*(len+1));
【扩充】
AddressSanitizer: stack-buffer-overflow on address 一般都是代码哪里出现了问题