- 看到题目时就想到了用strstr在字符串中查找字典中的字符串,因为strstr返回的是第一次出现的首地址,所以没想好怎么去找到Index,所以就停滞了,看了答案后恍然大悟,答案写的很巧妙,用返回的地址与字符串s的首地址做差再除以CHR类型的大小。
index = (sptr - targetPtr)/sizeof(char); - 再一个就是找到了index后如何去利用。题目中要求对于能连续的子串要连续加粗,所以可以将字典中的所有出现的字符在原串S中做好标记,用flag[len]去做标记,以便后面遍历
- 还有就是C语言怎么去拼接字符串,这里利用了sprintf做字符串拼接。
#define TAG_LEN 7
void SetFlag(char *s, char **words, int wordsSize, int *flag)
{
for (int i = 0; i < wordsSize; ++i) {
char *targetStrPtr = NULL;
targetStrPtr = strstr(s, words[i]);
while (targetStrPtr != NULL) {
int index = (targetStrPtr - s) / sizeof(char);
printf(" %s index is %d\n", words[i], index);
int wordLen = strlen(words[i]);
int left = index;
while (left < index + wordLen) {
flag[left++] = 1;
}
targetStrPtr = strstr(targetStrPtr + 1, words[i]);
}
}
}
char *addBoldTag(char * s, char ** words, int wordsSize){
int len = strlen(s);
int *flag = (int*)malloc(sizeof(int) * len);
memset(flag, 0x0, sizeof(int) * len);
char *result = (char*)malloc(sizeof(char) * (len + TAG_LEN * len));
memset(result, 0, len + TAG_LEN * len);
int resultIndex = 0;
SetFlag(s, words, wordsSize, flag);
for (int i = 0; i < len; ++i) {
if (flag[i] == 1 && (i == 0 || flag[i-1] == 0)) {
sprintf(result, "%s<b>", result);
resultIndex += 3;
}
result[resultIndex++] = s[i];
if (flag[i] == 1 && (i == len - 1 || flag[i+1] == 0)) {
sprintf(result, "%s</b>", result);
resultIndex += 4;
}
}
return result;
}