c-是否有任何函数可以将字符作为字符串的前缀并存储在同一个字符串中



我们如何在c中执行以下操作?s="#"s其中s是一个字符串。

我试过使用strncat((,但在连接后,答案应该存储在前缀为"#"的s中。

假设s有足够的元素,您可以通过以下方式向s添加一个字符的前缀:

  1. 通过memmove()将现有字符串滑动一个(不能使用strcpy()memcpy(),因为它们不支持复制到重叠区域(
  2. 编写要添加到s的第一个元素中的字符
#include <stdio.h>
#include <string.h>
int add_prefix(char* str, char c, size_t bufsz) {
size_t strsize = strlen(str) + 1;
if (bufsz <= strsize) {
return -1;
}
memmove(str + 1, str, strsize); /* +1 for terminating null-character */
str[0] = c;
return 0;
}
int main(void) {
char s[128] = "hello";
printf("before add_prefix() : %sn", s);
add_prefix(s, '#', sizeof(s));
printf("after  add_prefix() : %sn", s);
return 0;
}

对于初学者来说,存储源字符串的字符数组应该足够大,可以再追加一个字符。

这是一个示范节目。

#include <stdio.h>
#include <string.h>
int main( void )
{
char s[7] = "Hello";
memmove( s + 1, s, strlen( s ) + 1 );
s[0] = '#';
puts( s );
}

程序输出为

#Hello

一个更通用的方法可以看起来像

#include <stdio.h>
#include <string.h>
char * append_prefix( char s[], const char *prefix )
{
size_t n = strlen( prefix );
if (n != 0)
{
memmove( s + n, s, strlen( s ) + 1 );
memcpy( s, prefix, n );
}
return s;
}
int main( void )
{
char s[7] = "Hello";
puts( append_prefix( s, "#" ) );
}

使用函数append_prefix,只要结果字符数组有足够的空间,就可以在另一个字符串之前附加任何字符串。

这在某种程度上取决于应用程序。如果你正在编写一些字符串库、一些搜索算法或其他性能关键的东西,那么你可以像其他答案中所示的那样摆弄memmove,或者更可能是一些自定义的、基于对齐的算法。

但是,除非您有如此极端的RAM使用或性能要求,否则您可能应该将所有字符串视为";不可变的";(基本上是只读的(,然后创建一个新的。这是";足够好";对于平均C应用。

在这种情况下,它只是像:

char s[] = "hello";
char new_s [LARGE_ENOUGH] = "#";
strcat(new_s, s);

其中";足够大";可能是类似CCD_ 9的东西。

最新更新