是否有任何函数可以将字符作为字符串前缀并存储在同一字符串中?
Is there any function for prefixing a character to a string and store in the same string?
我们如何在c中进行以下操作?
小号=“#”+小号;
其中 s 是一个字符串 .
我试过使用 strncat() 但在连接后答案应该存储在前缀为“#.
的 s 中
假设s
有足够的元素,你可以通过以下方式给s
添加一个字符的前缀:
- 通过
memmove()
将现有字符串滑动一位(您不能使用 strcpy()
或 memcpy()
,因为它们不支持复制到重叠区域)
- 写入要添加到
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() : %s\n", s);
add_prefix(s, '#', sizeof(s));
printf("after add_prefix() : %s\n", 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
您可以将任何字符串追加到另一个字符串之前,前提是结果字符数组有足够的 space.
种类取决于应用程序。如果您正在编写一些字符串库、一些搜索算法或其他性能关键的东西,那么您可以 fiddle 和 memmove
一起使用,如其他答案所示,或者更可能是一些自定义的、基于对齐的算法。
但是除非您有如此极端的 RAM 使用或性能要求,否则您可能应该将所有字符串视为“不可变”(基本上是只读的)并创建一个新字符串。对于普通的 C 应用程序来说,这已经“足够好”了。
在这种情况下,它就像这样:
char s[] = "hello";
char new_s [LARGE_ENOUGH] = "#";
strcat(new_s, s);
其中“LARGE_ENOUGH”可能类似于 2 + strlen(s)
。
我们如何在c中进行以下操作? 小号=“#”+小号; 其中 s 是一个字符串 .
我试过使用 strncat() 但在连接后答案应该存储在前缀为“#.
的 s 中假设s
有足够的元素,你可以通过以下方式给s
添加一个字符的前缀:
- 通过
memmove()
将现有字符串滑动一位(您不能使用strcpy()
或memcpy()
,因为它们不支持复制到重叠区域) - 写入要添加到
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() : %s\n", s);
add_prefix(s, '#', sizeof(s));
printf("after add_prefix() : %s\n", 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
您可以将任何字符串追加到另一个字符串之前,前提是结果字符数组有足够的 space.
种类取决于应用程序。如果您正在编写一些字符串库、一些搜索算法或其他性能关键的东西,那么您可以 fiddle 和 memmove
一起使用,如其他答案所示,或者更可能是一些自定义的、基于对齐的算法。
但是除非您有如此极端的 RAM 使用或性能要求,否则您可能应该将所有字符串视为“不可变”(基本上是只读的)并创建一个新字符串。对于普通的 C 应用程序来说,这已经“足够好”了。
在这种情况下,它就像这样:
char s[] = "hello";
char new_s [LARGE_ENOUGH] = "#";
strcat(new_s, s);
其中“LARGE_ENOUGH”可能类似于 2 + strlen(s)
。