2016-09-23 384 views
1

我有一个字符串“abcdefg-this-is-a-test”,我想删除字符串的前6个字符。这是我想要的:从字符串获取子串C

char contentSave2[180] = "abcdefg-this-is-a-test"; 
strncpy(contentSave2, contentSave2+8, 4); 

到目前为止没有运气,处理器卡住并重置自己。 任何帮助将被处理。

问题:如何修剪C中的字符串?

////编辑//// 我也试过这样:

memcpy(contentSave2, &contentSave2[6], 10); 

不行的,同样的问题。

+0

什么是'contentSave'?没有定义 –

+0

对不起,我的坏。我只使用1个字符串数组,请参阅编辑。 – sdd

+0

总结一下:_http://ideone.com/5zXUbn_ –

回答

2

您的第一个代码片段的问题是,它将中间的四个字符复制到字符串的开头,然后停止。

不幸的是,你不能展开覆盖整个字符串,因为在这种情况下,源和输出缓冲器将重叠,造成UB:

If the strings overlap, the behavior is undefined.

重叠缓冲区与问题你的第二次尝试:memcpy不允许重叠缓冲区,所以行为是未定义的。

如果你需要的是在字符串的开始删除字符,你并不需要在所有复制:只需将初始字符的地址,并使用它作为新的字符串:

char *strWithoutPrefix = &contentSave2[8]; 

对于从一个缓冲器字符串复制到另一个使用memcpy

char middle[5]; 
memcpy(middle, &contentSave2[8], 4); 
middle[4] = '\0'; // "this" 

用于复印潜在重叠缓冲器使用memmove

char contentSave2[180] = "abcdefg-this-is-a-test"; 
printf("%s\n", contentSave2); 
memmove(contentSave2, contentSave2+8, strlen(contentSave2)-8+1); 
printf("%s\n", contentSave2); 

Demo.

+0

你能解释第一段吗?我实际上没有看到OPs代码的问题。 –

+0

@EugeneSh。 'strncpy'经常被错误地使用,字符串长度可变。最大的问题就是你必须记住最后以空字符结束结果字符串。 [这是一篇文章,解释在使用常规字符串时使用'n'函数有什么问题。](https://randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already/) – dasblinkenlight

+0

但是问题在这个问题上?我没看到它。 –

2

只要您可以使用指针,因为这里contentSave2也指向一个字符数组加上这将是快速而短暂。

char* ptr = contentSave2 + 6; 

ptr[0]将等于contentSave2[6]

0

下段应能正常工作:

#include <stdio.h> 
#include <string.h> 

int main() { 
    char contentSave2[180] = "abcdefg-this-is-a-test"; 
    strncpy(contentSave2, contentSave2+8, 4); 
    printf("%s\n", contentSave2); 
    return 0; 
} 

我建议可以发布您的代码的其余部分,因为你的问题是在其他地方。正如其他人所指出的那样,当你使用strncpy时应注意重叠,尽管在这种情况下它应该可以工作。

1

您可以使用memmove函数。

当源和目标内存地址重叠时,它特别使用。

小建议,尽量避免复制到和来自重叠源和目的地。它只是一个臭虫。

3
int len=strlen(content2save); 
for(i=6;i<len;i++) 
    content2save[i-6]=content2save[i]; 

content2save[i-6]='\0' 

这会删除前6位字符。基于需求你可以修改你的代码。如果你想使用内置功能尝试memmove

相关问题