This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center
7年前关闭。
关于以下功能,我有三个问题。我在代码中将它们标记为注释。
为什么我们要将destmalloced memory)指向的char项复制到dPtr,然后最后(在处理输入字符串之后)复制到return dest。在dest上操作不是更简单吗。
此函数基本上只在单词内部有破折号时反转该单词。标记的命令是否在先前递增的位置(in*subword = '\0';)-NULstrncpy中放置了subword+1字符?
此函数是否容易出现缓冲区溢出或其他不希望的行为?现在它没有给我任何错误,但我想我只是不知道如何调试它。
subwordlen
char* function(char* word, int len)
{
    char* subword = NULL;
    char* dest;
    char* dPtr;
    size_t n;

    dest = malloc(len+1);
    if (dest == NULL) return NULL;

    dPtr = dest;               /* [1] */

    while((subword = strrchr(word, '-'))!= NULL) {

        n = len - (subword-word) - (dPtr-dest);
        if (n-1 > 0)
            strncpy(dPtr, subword+1, n-1);

        *subword = '\0';      /* [2] */
        dPtr += n-1;
        *dPtr = '-';
        dPtr++;
    }
    strncpy(dPtr, word, len - (dPtr-dest));
    dest[len] = '\0';
    return dest;              /* [1] */
}

最佳答案

dPtr用于在字符串中移动并修改它。dest被保留为修改后的字符串的开头,最后是函数的返回值。在每个循环迭代结束时,dPtr将指向修改字符串的结尾,并用于每个连续的strncpy。最后,函数返回一个修改过的字符串,需要dest来跟踪它的开始。
subword可能以空结尾,因此只有subword中的字符将复制到循环内的strncpy中的结果中,但使用strncpy实际上不需要这样做。函数在字符串中向后移动以查找破折号。对于每次命中,subword是下一个用短划线分隔的子字符串。子字符串是原始字符串中的一块内存,它不是以空结尾的。如果您使用的是strcpy,则需要subword的空终止符,但由于您使用的是strncpy,因此不必使用空终止符:只需小心将n值作为strncpy限制。此代码null将subword就地终止,即在原始字符串参数中粘贴空字符。从而导致#3:
至于不需要的行为,函数通过修改原始字符串参数来完成它的工作—它将subword的那些空终止符放入源字符串—即使它为修改后的和返回的字符串保留了自己的缓冲区。
最后,通过使用dPtr操作而不是strncat操作,代码可以在没有strncpy的情况下运行。

关于c - 复制指针,然后返回第一个指针有什么用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12218736/

10-13 06:18