C 函数使用 malloc 替换字符串中的子字符串 - 无字符串函数



现在我可以将给定字符串中的单词 indifferent 替换为 nonchalant但我需要使这个函数动态化,以便indifferent可以用任何单词替换。我知道我需要使用 malloc 创建一个新数组,该数组将保存带有新单词的原始字符串,但对如何使用 malloc 还没有深刻的理解,请解释如何在这种情况下正确使用 malloc。 谢谢。

#include <stdio.h>
#include <stdlib.h>
int findPosition(char string[], char sub[]) {
    int i = 0;
    int j = 0;
    int f = 0;
    for (i = 0; string[i] != ''; i++) {
        if (sub[j] == string[i]) {
            if (sub[j + 1] == '') {
                f = 1;
                break;
            }
            j++;
        } else
            j = 0;
    }
    if (f == 1) {
        return i - j;
    }
    return -1;
}
int findLength(char sub[]) {
    int i = 0;
    for (i = 0; sub[i] != ''; i++) {
    }
    return i;
};
void replaceWord(char string[], char sub[], char replace[]) {
    int i = 0;
    int j = 0;
    int p = findPosition(string, sub);
    int l = findLength(sub);
    int k = p + l - 1;
    for (i = p; i < k; i++) {
        string[i] = replace[j];
        j++;
    }
    while(string[k] != '') {
        string[k] = string[k + 1];
        k++;
    }
}
int main(int argc, const char *argv[]) {
    char stringArray[120] = ""Mr.Fay, is this going to be a battle of wits?             ""
                            "t"If it is," was the indifferent retort, ""
                            "you have come unarmed!"";
    replaceWord(stringArray, "indifferent", "nonchalant");
    int i = 0;
    while (stringArray[i] != '') {
        printf("%c", stringArray[i]);
        i++;
    }
    return 0;
};
您可以使用

malloc为新字符串分配内存,其中将一个单词的每个出现替换为另一个单词:

#include <stdio.h>
#include <stdlib.h>
/* use a local implementation of the string functions: */
size_t my_strlen(const char *s) {
    size_t len;
    for (len = 0; s[len] != ''; len++)
        continue;
    return len;
}
void *my_memcpy(void *dest, const void *src, size_t n) {
    size_t i;
    for (i = 0; i < n; i++) {
        ((unsigned char*)dest)[i] = ((unsigned char*)src)[i];
    }
    return dest;
}
char *my_strdup(const char *s) {
    size_t n = my_strlen(s) + 1;
    char *p = malloc(n);
    if (p) my_memcpy(p, s, n);
    return p;
}
char *my_strstr(const char *s1, const char *s2) {
    for (;; s1++) {
        for (size_t i = 0;; i++) {
            if (s2[i] == '') return s1;
            if (s1[i] != s2[i]) break;
        }
        if (*s1 == '') return NULL;
    }
}
char *replaceWord(const char *str, const char *s1, const char *s2) {
    char *res = my_strdup(str); /* return value is always allocated */
    char *p, *q;
    size_t offset = 0;
    size_t len = my_strlen(str);
    size_t len1 = my_strlen(s1);
    size_t len2 = my_strlen(s2);
    if (len1 == 0)
        return res;
    while ((p = my_strstr(res + offset, s1)) != NULL) {
        offset = p - res;
        if (len1 == len2) {
            /* no need to reallocate, replace in place */
            my_memcpy(res + offset, s2, len2);
        } else {                
            /* allocate a new array with the adjusted length */
            q = malloc(len + len2 - len1 + 1);
            /* copy the beginning of the string */
            my_memcpy(q, res, offset);
            /* copy the replacement string */
            my_memcpy(q + offset, s2, len2);
            /* copy the remainder of the string, and the final '' */
            my_memcpy(q + offset + len2, res + offset + len1, len - offset - len1 + 1);
            /* free the previous string */
            free(res);
            res = q;
        }
        /* search for matches from the end of the replacement */
        offset += len2;
    }
    return res;
}
int main(int argc, const char *argv[]) {
    char stringArray[120] = ""Mr.Fay, is this going to be a battle of wits?             ""
                            "t"If it is," was the indifferent retort, ""
                            "you have come unarmed!"";
    char *p = replaceWord(stringArray, "indifferent", "nonchalant");
    printf("%s", p);
    free(p);
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新