在某些项目中,我有一段错误的C代码,但只有特定的输入字符串。我只编译这篇文章:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define slength 1000 // max string length
char ss[slength];
int main(void) {
strcpy(ss, "\"abcdefghijkl\"");
printf("1 %s\n",ss);
if (ss[0]=='"') { // remove quotes
printf("2 %s\n",ss);
strcpy(ss, ss+1); // remove first symbol - quote
printf("3 %s\n",ss);
ss[strlen(ss)-1]='\0'; //last symbol
printf("4 %s\n",ss);
}
printf("5 %s\n",ss);
return EXIT_SUCCESS;
}
结果是
1 "abcdefghijkl"
2 "abcdefghijkl"
3 abcdefhhijkl"
4 abcdefhhijkl
5 abcdefhhijkl
所以我得到'abcdefhhijkl'而不是'abcdefghijkl'。哪里错了?感谢。
P.S。我希望我的代码中没有任何多字节/ Unicode字符,但可能需要进一步检查。
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
Linux test-i3 3.13.0-63-generic #104~precise1-Ubuntu SMP Tue Aug 18 17:03:00 UTC 2015 i686 i686 i386 GNU/Linux
答案 0 :(得分:2)
来自strcpy(3)
手册:
The strings may not overlap, and the destination string dest must be
large enough to receive the copy. Beware of buffer overruns! (See
BUGS.)
您应该使用memmove(3)
:
memmove(ss, ss+1, strlen(ss)); // remove first symbol - quote
......而不是......
strcpy(ss, ss+1); // remove first symbol - quote