2010-05-21 30 views
1
// The first example: 
char text[] = "henri"; 
char *p; 
p = text; 
*(p + 1) = 'E'; // Output = hEnri 
// Now If we want to remove the "e" ie hnri, we would go for????? 
    *(p + 1)=????? 

显而易见的答案是将数组的其余部分复制一个位置。但是这似乎......不愉快。当然有更好的办法吗?有没有一种很好的方法可以从字符串中删除一个字符而不需要复制它后面的所有字符?

+7

使用锤子! – Codism 2010-05-21 18:20:55

+3

我不认为这是可能的一个单一的分配操作。 – FrustratedWithFormsDesigner 2010-05-21 18:21:33

+1

@Codism更好地使用你的头:-) – 2010-05-21 18:21:49

回答

4

复制最好的解决方案,真正当你去除数组中元素的唯一解决方案。 (你可以在数组的末尾特殊指定元素,但就是这样)。我不明白为什么这么糟糕。

你需要做两件事之一。两者都涉及一些复制。 1)将'n'复制到'E'所在的位置,'r'复制到'n'所在的位置,'i'复制到'r'所在的位置,然后null终止它。 2)将'h'复制到'E'所在的位置,然后始终使用指向'h'新位置的指针。这可能并不总是一种选择。

+0

如果字符串非常长且分配在堆上,您可能还需要复制指针并保存一些循环。移动指针更有效率(例如链接列表) – 2010-05-30 00:15:21

1

你必须将所有剩余的字符移动一个。没有办法说“跳过这个字符”。

while (*p) 
{ 
    *p = *p++; 
} 

编辑:呃,我是怎么犯这个错误的?现在修复。 p在字符串的末尾仍然是非空的,但* p不会。

+1

这里有两个错误:1. while(p)'将继续循环,直到p为NULL,你想'while(* p)'2。即使这样,你需要复制结尾''\ 0'' – 2010-05-21 18:24:10

+0

@BlueRaja:* p是一个完整的脑衰,谢谢。但是你不需要复制终止0,这将在循环的最后一次迭代中完成。 – Vicky 2010-05-21 18:26:35

+0

不* p = * p ++不会导致未定义的行为,因为您修改了'p'并且读取了它(不仅仅是为了确定要存储的值)而没有介入序列点?此外,我看不到一种方式来排序会做正确的修改(它绝对不能用'gcc')。如果您将其更改为'* p = *(p + 1); ++ p;'它确实有效。 – 2010-05-21 19:58:18

3
*++p = 'h'; 
puts(p); 
+1

因为我很确定这不是面试官寻找的过于聪明的答案。 -shrug- – 2010-05-21 18:30:46

+0

@Neil:因为如果我们尝试打印'text',那将无法工作:) – 2010-05-21 18:45:12

0

向下移动的字符由1之后(包括在末尾空)

你会结尾处有两个零点,顺便结束了。

0

这不是复制数组。我在同一个数组中移动数据。

for (p = text + 1; *p != '\0'; ++p) { 
    *p = *p + 1; 
} 

一个hackier的解决办法是把“H”,其中“E”是,和返回一个指向新的开始。

*p + 1 = *p; 
p = p + 1; 
0

这应该做到这一点:

的memmove(P + 1,P + 2,4);

我们移动了四个字符,因为我们也想复制空终止符。

0

没有办法删除从C字符串什么不复制下面的字符来填补漏洞。

但你可能改变你的数据结构,并使用一个字符串以外的东西。例如,您可以使用数组或字符串段的链接列表。这有时被称为“绳索”。

当然,当您需要将数据传递给其他需要C字符串的函数时,您必须复制整个事物。

相关问题