[英]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]
以下代码段应该可以正常运行:
#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.