我用 C 编写了一个函数来修剪字符串中的空白字符。
我关心的是最后一行trim()下面的函数,其中源包含在目标中。测试用例以及其他一些测试结果都很好。复制源和目标位于同一内存中的字符串的全部或部分会导致奇怪的问题吗?
源代码:
#include <stdio.h>
#include <string.h>
void trim(char *line)
{
int i, len = strlen(line);
char *ptr, whitespace[] = " \t\n";
// scan for first char which does not match a char in whitespace string
for (i=0; i<len; i++)
if (strchr(whitespace, line[i]) == NULL)
break;
ptr = line + i;
// scan for last char which does not match a char in whitespace string
for (i=len; i>0; i--)
if (strchr(whitespace, line[i]) == NULL)
break;
line[i] + 1) = '\0';
// copy result to line (this is the line relevant to the question)
strncpy(line, ptr, len);
}
int main(void)
{
int i;
char test[4][64] = {
"a line with no leading and trailing spaces",
" a line with some leading and trailing spaces ",
"\ta line with leading and trailing tabs\t",
"\na line with leading and trailing newlines\n"
};
for (i=0; i<4; i++)
{
printf("test %d\nno trim: %s\n", i, test[i]);
trim(test[i]);
printf("trimmed: %s\n", test[i]);
}
return 0;
}
如果你读过例如this strncpy参考你会看见
如果字符数组重叠,则行为未定义。
你需要使用memmove相反,它被指定来处理重叠内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)