从C中的字符串获取子字符串
我有一个字符串“abcdefg-this-is-a-test”,我想删除该字符串的前6个字符。这就是我正在尝试的:从C中的字符串获取子字符串,c,arrays,string,substring,trim,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中修剪字符串 ////编辑//// 我也试过: memcpy(contentSave2, &contentSa
char contentSave2[180] = "abcdefg-this-is-a-test";
strncpy(contentSave2, contentSave2+8, 4);
到目前为止运气不好,处理器卡住并自行复位。
任何帮助都将被告知
问题:如何在C中修剪字符串
////编辑////
我也试过:
memcpy(contentSave2, &contentSave2[6], 10);
不起作用,同样的问题 第一个代码段的问题是,它将中间的四个字符复制到字符串的开头,然后停止 不幸的是,您无法将其展开以覆盖整个字符串,因为在这种情况下,源缓冲区和输出缓冲区将重叠,从而导致UB: 重叠缓冲区是您第二次尝试的问题:
memcpy
不允许重叠缓冲区,因此行为未定义
如果只需删除字符串开头的字符,则根本不需要复制它:只需获取初始字符的地址,并将其用作新字符串:
char *strWithoutPrefix = &contentSave2[8];
要将字符串从一个缓冲区复制到另一个缓冲区,请使用memcpy
:
char middle[5];
memcpy(middle, &contentSave2[8], 4);
middle[4] = '\0'; // "this"
要复制可能重叠的缓冲区,请使用:
第一个代码段的问题是,它将中间的四个字符复制到字符串的开头,然后停止 不幸的是,您无法将其展开以覆盖整个字符串,因为在这种情况下,源缓冲区和输出缓冲区将重叠,从而导致UB: 重叠缓冲区是您第二次尝试的问题:
memcpy
不允许重叠缓冲区,因此行为未定义
如果只需删除字符串开头的字符,则根本不需要复制它:只需获取初始字符的地址,并将其用作新字符串:
char *strWithoutPrefix = &contentSave2[8];
要将字符串从一个缓冲区复制到另一个缓冲区,请使用memcpy
:
char middle[5];
memcpy(middle, &contentSave2[8], 4);
middle[4] = '\0'; // "this"
要复制可能重叠的缓冲区,请使用:
您可以简单地使用指针,因为
contentSave2
这里还有一个指向字符数组的指针,加上这将是快速而简短的
char* ptr = contentSave2 + 6;
ptr[0]
将等于contentSave2[6]
您可以使用指针,因为contentSave2
这里还有一个指向字符数组的指针,而且这将是快速而简短的
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;
}
#包括
#包括
int main(){
char contentSave2[180]=“abcdefg-this-is-a-test”;
strncpy(contentSave2,contentSave2+8,4);
printf(“%s\n”,contentSave2);
返回0;
}
我建议发布您的代码的其余部分,因为您的问题在其他地方。正如其他人所指出的,在使用strncpy时要注意重叠,尽管在这种特定情况下它应该可以工作。以下代码片段应该可以工作:
#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;
}
#包括
#包括
int main(){
char contentSave2[180]=“abcdefg-this-is-a-test”;
strncpy(contentSave2,contentSave2+8,4);
printf(“%s\n”,contentSave2);
返回0;
}
我建议发布您的代码的其余部分,因为您的问题在其他地方。正如其他人所指出的,使用strncpy时要注意重叠,尽管在这种特定情况下它应该可以工作。您可以使用函数
当源和目标内存地址重叠时,它特别使用
小小的建议,尽量避免复制到和从重叠的源和目标。这只是一个错误。您可以使用函数
int len=strlen(content2save);
for(i=6;i<len;i++)
content2save[i-6]=content2save[i];
content2save[i-6]='\0'
当源和目标内存地址重叠时,它特别使用
小小的建议,尽量避免复制到和从重叠的源和目标。它只是一个bug。int len=strlen(content2save);
int len=strlen(content2save);
for(i=6;i<len;i++)
content2save[i-6]=content2save[i];
content2save[i-6]='\0'
对于(i=6;iint len=strlen(content2save);
对于(i=6;i什么是contentSave
?它没有定义我很抱歉,我的错。我只使用了一个字符串数组,请参见编辑。求和即可:“字符串数组”是一个非常不幸的术语。它是一个字符串,是一个数组(由字符组成的字符串)。它不是“字符串数组”直到它成为一个字符串数组。@Guedes谢谢,这会给出正确的输出,但是如何将此输出存储到contentSave2字符串中?什么是contentSave
?它没有定义我很抱歉,我的错。我只是使用了一个字符串数组,请参见编辑。求和即可:“字符串数组”是一个非常不幸的术语。它是一个字符串,也是一个数组(指字符,形成字符串)。它不是“字符串数组”直到它成为一个字符串数组。@Guedes谢谢,这会给出正确的输出,但是我如何将此输出存储到contentSave2字符串中?请解释第一段?我实际上看不出OPs代码的问题。@EugeneSh。strncpy
经常错误地用于可变长度的字符串。最大的问题是我的意思是,你必须记住在最后以null终止生成的字符串。但是问题是什么?我看不到。@EugeneSh。我编辑了答案。他编辑的代码的问题是缓冲区重叠,因此strncpy
不再适用。我认为他的代码中没有重叠。你能解释一下吗请解释第一段?我实际上没有看到OPs代码的问题。@EugeneSh.strncpy
经常被错误地用于可变长度的字符串。最大的问题是,您必须记住在最后以null终止结果字符串。但问题是什么?我看不到。@EugeneSh、 我编辑了答案。他编辑的代码的问题是缓冲区重叠,因此strncpy
不再适用。我认为他的代码没有重叠。