从字符串中删除前几个字符
Remove first few characters from a string
我需要从没有任何库的 数组 中删除前 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
或任何其他标准库函数的情况下从数组中删除字符吗?
只要知道字符串至少有3个字符长,就可以简单地使用str + 3
.
不需要传"amount"个字符作为参数,可以搜索'\0':
void chopN(char *str, size_t n){
char *aux;
int i=0,j=0;
while(str[i]!='[=10=]'){
if(i>n+1){
aux[j++]=str[i++];
}else i++;
}
aux[j]='[=10=]';
str = aux;
}
这是一个不使用标准 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 )
只需从新的开始(str+n)开始,逐个字符复制到旧的开始字符,直到到达字符串的末尾:
char *str1;
for(str1 = str+n; *str1; *str++=*str1++)
;
*str = 0;
如果你想要更强大的东西,你可以例如从 http://git.musl-libc.org/cgit/musl/tree/src/string/memmove.c 窃取一个 memmove 实现(它基本上做同样的事情,除了一些性能调整和决定使用哪种方式(left/right) 移动进行)。
嗯: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 = '[=10=]';
}
如果需要,可以添加 if (n==0)
快捷方式。
我需要从没有任何库的 数组 中删除前 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
或任何其他标准库函数的情况下从数组中删除字符吗?
只要知道字符串至少有3个字符长,就可以简单地使用str + 3
.
不需要传"amount"个字符作为参数,可以搜索'\0':
void chopN(char *str, size_t n){
char *aux;
int i=0,j=0;
while(str[i]!='[=10=]'){
if(i>n+1){
aux[j++]=str[i++];
}else i++;
}
aux[j]='[=10=]';
str = aux;
}
这是一个不使用标准 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 )
只需从新的开始(str+n)开始,逐个字符复制到旧的开始字符,直到到达字符串的末尾:
char *str1;
for(str1 = str+n; *str1; *str++=*str1++)
;
*str = 0;
如果你想要更强大的东西,你可以例如从 http://git.musl-libc.org/cgit/musl/tree/src/string/memmove.c 窃取一个 memmove 实现(它基本上做同样的事情,除了一些性能调整和决定使用哪种方式(left/right) 移动进行)。
嗯: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 = '[=10=]';
}
如果需要,可以添加 if (n==0)
快捷方式。