我需要从数组中删除前3个字符而不使用任何库。我该怎么做呢?我知道我可以使用memmove
,但我正在使用没有标准库的系统,memmove
也是指针。使用memmove
我可以this:
void chopN(char *str, size_t n)
{
assert(n != 0 && str != 0);
size_t len = strlen(str);
if (n > len)
return; // Or: n = len;
memmove(str, str+n, len - n + 1);
}
但是我可以在没有memmove
或任何其他标准库函数的情况下从数组中删除字符吗?
答案 0 :(得分:2)
只要您知道字符串长度至少为3个字符,您就可以使用str + 3
。
答案 1 :(得分:2)
嗯:2个简单的while循环应该这样做。
一些未经测试的代码可以给你一个想法。
void chopN(char *str, size_t n) {
char *dest = str;
// find beginning watching out for rump `str`
while (*str && n--) {
str++;
}
// Copy byte by byte
while (*src) {
*dest++ = *src++;
}
*dest = '\0';
}
如果需要,可以添加if (n==0)
快捷方式。
答案 2 :(得分:1)
这是一个不使用标准C字符串函数的函数。 n
可以小于或等于strlen( s )
。否则该函数什么都不做。
#include <stdio.h>
char * chopN( char *s, size_t n )
{
char *src = s;
while ( *src && n ) --n, ++src;
if ( n == 0 && src != s )
{
for ( char *dst = s; ( *dst++ = *src++ ); );
}
return s;
}
int main(void)
{
char s[] = "Hello, World";
puts( s );
puts( chopN( s, 7 ) );
return 0;
}
程序输出
Hello, World
World
如果您希望在n
大于strlen( s )
的情况下删除所有字符,那么替换if语句就足够了
if ( n == 0 && src != s )
这个
if ( src != s )
答案 3 :(得分:0)
您不需要将“数量”的字符作为参数传递,您可以搜索'\ 0':
void chopN(char *str, size_t n){
char *aux;
int i=0,j=0;
while(str[i]!='\0'){
if(i>n+1){
aux[j++]=str[i++];
}else i++;
}
aux[j]='\0';
str = aux;
}
答案 4 :(得分:0)
只需从新的开始(str + n)开始,然后按char复制到旧的开始字符,直到到达字符串的末尾:
char *str1;
for(str1 = str+n; *str1; *str++=*str1++)
;
*str = 0;
如果你想要更强大的东西,你可以例如,从http://git.musl-libc.org/cgit/musl/tree/src/string/memmove.c窃取memmove实现(它基本上做同样的事情,除了一些性能调整和决定在哪个方向(左/右)移动去)。