我需要一些帮助:
我试图从指针中删除一个单词,并将其放入一个新的指针中,但无法将其复制到新指针
我不确定什么时候该使用free()函数。
当我在delete函数中使用free(str)时,它会崩溃。
在我将“str”复制到“newStr”之后,将“newStr”复制回具有新长度的“str”的最佳方法是什么?
请帮助我理解它,我是新来的,我用谷歌搜索它,我试图在这里寻找,没有找到什么可以帮助我。

void delete(char *str)
{
    int i, indexStart = 0, indexEnd = 0, wordlen = 0, newLen = 0, len = 0;
    printf("Enter the index of the word that you want to remove:  ");
    scanf("%d", &i);
    indexs(i, str,&indexStart,&indexEnd,&wordlen);
    len = strlen(str);
    newLen = len - wordlen - 1;
    char *newStr = (char*)malloc(newLen * sizeof(char));
    if (newStr == NULL)
    {
        printf("Error! memory not allocated.");
        exit(0);
    }
    for (int j = 0; j < len; j++)
    {
        if (j< (indexStart - 1) || j > indexEnd)
        {
            *newStr = *str;
            newStr++;
        }
        str++;
    }

    free(str);
    //free(newStr);
    printf("The new string:  %s\n", newStr);
}
void main()
{
    char *str = (char*)malloc(1 * sizeof(char));
    if (str == NULL)
    {
        printf("Error! memory not allocated.");
        exit(0);
    }
    text(str);

    if (str != NULL)
    {
        delete(str);
    }
    free(str);
    system("pause");
}

最佳答案

根据structured programming paradigm你的函数应该解决小的独立任务。但是您的函数delete()会打印到控制台,扫描输入,分配新字符串并填充这个新字符串。但更糟糕的是这个函数中的调用exit()。如果出现错误,函数必须返回错误,但不能停止程序。函数的名称也应该重新影响它们的工作。
free()分配的每个内存块使用malloc()
所以,这是一个工作代码:

#include <stddef.h>

#include <stdio.h>

#include <string.h>
#include <malloc.h>

const char *findWord(const char *str, const char *delimiters, unsigned index) {
    // validate input parameters
    if (!str || !delimiters) {
        return NULL;
    }

    // count words
    unsigned count = 0;
    while (*str && count < index) {
        // skip delimiters
        while (*str && !strchr(delimiters, *str)) {
            str++;
        }

        if (*str) {
            count++;
        }

        // skip word
        while (*str && strchr(delimiters, *str)) {
            str++;
        }
    }

    // if index is too big returns NULL
    return *str ? str : NULL;
}

unsigned countLengthOfWord(const char *str, const char *delimiters) {
    // validate input parameters
    if (!str || !delimiters) {
        return 0;
    }

    // count length
    unsigned length = 0;
    while (*str && !strchr(delimiters, *str++)) {
        length++;
    }

    return length;
}

char *cutWord(char *str, const char *delimiters, unsigned index) {
    // validate input parameters
    if (!str) {
        return NULL;
    }

    str = (char *)findWord(str, delimiters, index);

    // if index is too big, return NULL
    if (!str) {
        return NULL;
    }

    // allocate new string for word
    unsigned length = countLengthOfWord(str, delimiters);
    char *word = malloc(length + 1);

    // check if allocation was successfull
    if (!word) {
        return NULL;
    }

    // copy word
    strncpy(word, str, length);
    word[length] = '\0';

    // cut word from string
    const char *ptr = str + length;
    while (*ptr) {
        *str++ = *ptr++;
    }
    *str = '\0';

    return word;
}

int main() {
    char str1[] = "Hello, my world!";
    char str2[] = "Hello, my world!";
    char str3[] = "Hello, my world!";

    char *word1 = cutWord(str1, " ,!", 0);
    char *word2 = cutWord(str2, " ,!", 1);
    char *word3 = cutWord(str3, " ,!", 2);

    if (word1) {
        printf("word: %s\nstring: %s\n\n", word1, str1);
    }

    if (word2) {
        printf("word: %s\nstring: %s\n\n", word2, str2);
    }

    if (word3) {
        printf("word: %s\nstring: %s\n\n", word3, str3);
    }

    // release allocated memory
    free(word1);
    free(word2);
    free(word3);

    getchar();

    return 0;
}

关于c - C尝试将指针复制到新指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46541452/

10-11 23:08
查看更多