我有一个字符串“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);
不起作用,同样的问题。
答案 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:
重复缓冲区是第二次尝试的问题: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);
答案 2 :(得分:2)
只需你可以使用指针,因为contentSave2
这里也是一个指向char数组的指针加上这将是快速和简短的。
char* ptr = contentSave2 + 6;
ptr[0]
将等于contentSave2[6]
答案 3 :(得分:1)
答案 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
时注意重叠,尽管在这种特殊情况下它应该有效。