Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C中的字符串获取子字符串_C_Arrays_String_Substring_Trim - Fatal编程技术网

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

从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

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

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;i
int len=strlen(content2save);

对于(i=6;i什么是
contentSave
?它没有定义我很抱歉,我的错。我只使用了一个字符串数组,请参见编辑。求和即可:“字符串数组”是一个非常不幸的术语。它是一个字符串,是一个数组(由字符组成的字符串)。它不是“字符串数组”直到它成为一个字符串数组。@Guedes谢谢,这会给出正确的输出,但是如何将此输出存储到contentSave2字符串中?什么是
contentSave
?它没有定义我很抱歉,我的错。我只是使用了一个字符串数组,请参见编辑。求和即可:“字符串数组”是一个非常不幸的术语。它是一个字符串,也是一个数组(指字符,形成字符串)。它不是“字符串数组”直到它成为一个字符串数组。@Guedes谢谢,这会给出正确的输出,但是我如何将此输出存储到contentSave2字符串中?请解释第一段?我实际上看不出OPs代码的问题。@EugeneSh。
strncpy
经常错误地用于可变长度的字符串。最大的问题是我的意思是,你必须记住在最后以null终止生成的字符串。但是问题是什么?我看不到。@EugeneSh。我编辑了答案。他编辑的代码的问题是缓冲区重叠,因此
strncpy
不再适用。我认为他的代码中没有重叠。你能解释一下吗请解释第一段?我实际上没有看到OPs代码的问题。@EugeneSh.
strncpy
经常被错误地用于可变长度的字符串。最大的问题是,您必须记住在最后以null终止结果字符串。但问题是什么?我看不到。@EugeneSh、 我编辑了答案。他编辑的代码的问题是缓冲区重叠,因此
strncpy
不再适用。我认为他的代码没有重叠。