繁体   English   中英

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

[英]Getting substring from string in C

我有一个字符串“ 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);

不起作用,同样的问题。

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

content2save[i-6]='\0'

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

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

不幸的是,您不能将其扩展为覆盖整个字符串,因为在这种情况下,源缓冲区和输出缓冲区会重叠,从而导致UB:

如果字符串重叠,则行为未定义。

缓冲区重叠是您第二次尝试的问题: 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);

演示

您可以简单地使用指针,因为这里的contentSave2也是指向char数组的指针,这将很快且简短。

char* ptr = contentSave2 + 6;

ptr[0]等于contentSave2[6]

您可以使用记忆功能。

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

小建议,尽量避免在重叠的源和目的地之间来回复制。 这仅仅是一个buggen。

以下代码段应该可以正常运行:

#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时请注意是否有重叠,尽管在这种情况下它应该可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM