在C中从字符串获取子字符串

时间:2016-09-23 13:57:46

标签: c arrays string substring trim

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

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

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

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

//// //// EDIT 我也试过这个:

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

不起作用,同样的问题。

5 个答案:

答案 0 :(得分:3)

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

content2save[i-6]='\0'

这将删除前6个字符。根据要求,您可以修改您的代码。如果您想使用内置函数,请尝试memmove

答案 1 :(得分: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.

答案 2 :(得分:2)

只需你可以使用指针,因为contentSave2这里也是一个指向char数组的指针加上这将是快速和简短的。

char* ptr = contentSave2 + 6;

ptr[0]将等于contentSave2[6]

答案 3 :(得分:1)

您可以使用memmove功能。

当源和目标内存地址重叠时专用。

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

答案 4 :(得分: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时注意重叠,尽管在这种特殊情况下它应该有效。