【发布时间】:2016-10-06 08:38:44
【问题描述】:
我想编写一个 C 函数,用于删除给定索引范围的字符串的一部分。
例如,如果输入字符串是“ABCDEFGHIJK”,起始索引是 2,结束索引是 5,那么输出应该是:“ABGHIJK”。
我正在尝试使用两个函数来执行此操作,一个函数获取我们要删除的子字符串:
void get_substring(char string[], char substring[], int start, int end) {
strncpy(substring, string + start, end - start + 1);
}
然后是删除此子字符串的第二个函数:
void remove_portion(char string[], char substring[]) {
// memmove?
}
我正在考虑的另一种可能性是直接修改原始字符串而不使用子字符串:
void remove_portion(char string[], int start, int end) {
// if end is less then the length of the string, then
// copy everything after string[end] into a temp string
// Then replace string[start] with '\0' and then concatenate
// string and temp.
// If end is greater than the length of string then just replace
// string[start] with '\0'.
}
这是正确的方法吗?是否有任何来自 string.h 的内置函数在这里有用?
【问题讨论】:
-
memmove函数在这两种情况下都是正确的。使用第一个变体(有两个函数)的问题是您在remove_portion函数中必须首先find 子字符串。还不如直接选择第二种。 -
我查看了 memmove 的文档,据我了解,它将 n 个字符从一个字符串复制到另一个字符串,但我仍然不明白这如何帮助删除字符。当 memmove 移动字符时,它是否也将它们从原始字符串中删除?
-
它不会“删除”字符,而是覆盖它们。它与
string[i] = string[i + x]基本相同,但以一种安全的方式进行(除非你越界)。您只需告诉memmove获取字符串的尾部(要删除的子字符串之后的部分),包括终止符并将其移到要删除的子字符串上。