我试图创建一个从给定字符串中删除空格和制表符的函数,但字符串中的第一个制表符或空格除外。当我使用我的函数时,它删除除第一个之外的空格和制表符,但它也删除第一个空格或制表符后的第一个字母。 例如> “ad ad ad”> “ad dad”而不是“ad adad” 那是为什么?
void RemoveSpacetab(char* source) {
char* i = source;
char* j = source;
int spcflg = 0;
while(*j != 0) {
*i = *j++;
if((*i != ' ') && (*i != '\t'))
i++;
if(((*i == ' ') || (*i == '\t')) && (spcflg == 0)) {
i++;
spcflg = 1;
}
}
*i = 0;
}
答案 0 :(得分:1)
您需要将源阵列和目标阵列分开,因为它们将变为不同的长度。你可以在复制像这样的字符之前找到起始位置,假设你将源和源的长度传递为char* source, int length
(你也可以用strlen(source)
来计算源的长度,然后你的函数可能看起来像这样:
int i = 0;
char* dest = malloc(sizeof(char) * length);
// Increment i until not space to find starting point.
while (i < length && (source[i] == '\t' || source[i] == ' ')) i++;
int dest_size = 0;
while (i < length) {
if (source[i] != '\t' && source[i] != ' ') {
// Copy character if not space to dest array
dest[dest_size++] = source[i];
}
i++;
}
dest[dest_size++] = 0; // null terminator
// Feel free to realloc to the right length with
// realloc(dest, dest_size * sizeof(char))
return dest;
答案 1 :(得分:1)
两个if
语句一个接一个地引起的问题。当您第一次检测到空格时,i
会先于j
。
<强>解释强>
在第一个周期中,i
也指向位置0和j
。位置0的'a'
将被自身覆盖,然后j
向前移动到位置1
。您的第一个if
块会发现位置0处的字符不是空格而不是制表符,因此将i
移动到位置1。
在第二个周期中,'b'
将被自身覆盖,然后j
移动到位置2,这是一个空格。第一个if
发现位置1的'b'
不是空格而不是标签,因此将i
移动到位置2.现在第二个if
发现i
第一次指向空格并将其移至位置3,而j
仍然指向位置2.
在第三个周期中,位置3的'a'
将被位置2的空格覆盖,而j
会被i
追踪。
您的代码的可能修复:
#include <stdio.h>
void RemoveSpacetab(char* source) {
char* i = source;
char* j = source;
char spcflg = 0;
while(*j != 0) {
*i = *j++;
if(*i == ' ' || *i == '\t') {
if(!spcflg) {
i++;
spcflg = 1;
}
}
else {
i++;
}
}
*i = 0;
}
int main() {
char my_string[] = "ad ad ad";
RemoveSpacetab(my_string);
printf("%s\n", my_string);
return 0;
}