关于以下功能我有3个问题。我在代码中将它们标记为注释。
为什么我们将dest
(malloc
ed memory)指向的char项复制到dPtr
,然后最后(处理输入字符串后){{1 }}。在return dest
上进行操作不会更简单。
此功能只有在内部有破折号时才会反转该字。标记的命令dest
是否将*subword = '\0';
字符放在先前增加的位置(NUL
) - strncpy
或subword+1
?
此功能是否容易出现缓冲区溢出或其他不良行为?现在它没有给我任何错误,但我想我只是不知道如何调试它。
subword
是len
strlen(word)
答案 0 :(得分:1)
为什么我们将dest(malloced内存)指向的char项复制到dPtr,然后在最后(处理输入字符串后)返回dest。在dest上操作会不会更简单。
因为在函数结束时,dPtr
不会指向dest
字符串的开头,所以如果指针本身是dest
,我们就不会返回整个我们建造的desination字符串。
答案 1 :(得分:1)
dest
,则函数返回的值将不相同。所以你需要传递一个临时指针。\0
字符放在*subword
的位置(而不是-
字符)。答案 2 :(得分:1)
dPtr
用于遍历字符串并对其进行修改。 dest
被保留为该修改后的字符串的开头,最终是函数的返回值。在每次循环迭代结束时,dPtr
将指向修改后的字符串的末尾,并用于每个连续的strncpy
。最终,该函数返回一个修改后的字符串,并且需要dest
来跟踪它的开始。
subword
被终止,因此只有subword
中的字符才会被复制到循环中strncpy
的结果中,但实际上这不是必需的使用strncpy
。该函数向后移动通过字符串寻找破折号。对于每次点击,subword
是下一个划线划分的子字符串。子字符串是内部内存的一段内存,它不是以空字符结尾的。如果您使用的是strcpy
,那么您需要subword
的空终止,但由于您使用的是strncpy
,因此无需使用空终结符:只需要小心n
值为strncpy
限制。此代码空终止subword
到位,即在原始字符串参数中粘贴空字符。这导致#3:
对于不受欢迎的行为,该函数通过修改原始字符串参数来完成它的工作 - 它将subword
的那些空终止符放入源字符串中 - 即使它保留了自己的修改后的缓冲区和返回字符串。
最后,使用dPtr
操作而不是strncat
,代码可以不使用strncpy
。