我有一个字符串,我想用引号包围。
到目前为止我所拥有的是:
#include <stdio.h>
#include <string.h>
int main(){
char my_str[100] = {0};
strcat(my_str, "hello world!");
strcat(my_str, "\"");
strcat(strrev(my_str), "\""); // I want a simpler way for this
strrev(my_str); // and this (though it isn't that complicated...)
printf("%s", my_str);
return 0;
}
输出(按预期)是&#34; hello world!&#34;
是否有更简单的方法或内置函数来执行此操作?
PS。 C ++中的答案(处理C字符串)也没关系
答案 0 :(得分:2)
在C ++中,您可以使用重载的+
运算符作为字符串。
std::string my_str;
... // here you calculate the contents of my_str
my_str = "\"" + my_str + "\"";
如果由于某种原因您有义务使用char
数组,则应首先将其转换为string
:
char my_str[100];
... // here you calculate the contents of my_str
auto new_my_str = "\"" + std::string(my_str) + "\"";
这里,第一个或第二个字符串应该是C ++字符串(即std::string
而不是char
数组),以使重载的运算符工作。
在C ++ 14中,您可以使用字符串文字使用s
后缀使第一个字符串成为正确的类型:
char my_str[100];
... // here you calculate the contents of my_str
auto new_my_str = "\""s + my_str + "\"";
如果您还希望输出在同一个char
数组中,请在生成的C ++字符串上使用c_str
和strcpy
。您甚至可以将其放入一行代码中:
char my_str[100];
... // here you calculate the contents of my_str
strcpy(my_str, ("\""s + my_str + "\"").c_str());
与以前的代码不同,此代码容易受到缓冲区溢出的影响。
答案 1 :(得分:1)
我认为源数组已经包含一个字符串。否则,您可以从头开始构建引号中的字符串。
你在这里。
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[100] = "Hello World";
size_t n = strlen( s );
memmove( s + 1, s, n );
s[0] = '\"';
s[n+1] = '\"';
s[n+2] = '\0';
puts( s );
return 0;
}
程序输出
"Hello World"
在C ++中如果要使用模板类std :: string,那么可以通过以下方式完成相同的任务
#include <iostream>
#include <string>
int main()
{
std::string s( "Hello World" );
s.reserve( s.size() + 2 );
s.insert( 0, 1, '\"' );
s += '\"';
std::cout << s << std::endl;
return 0;
}
否则,如果您处理包含字符串的字符数组,则该方法将与为C显示的方法相同。
答案 2 :(得分:0)
是否有一个内置函数,从字符串start开始就像strcat一样?
是的,它被称为strcat
。在正常情况下你会做的只是创建第二个字符串:
char arr1[N] = "hello world";
char* use_this = arr1;
puts(use_this);
char arr2[N] = "\"";
strcat(arr2, use_this);
use_this = arr2;
strcat(use_this "\"");
puts(use_this);
尝试“聪明”并通过这样做来节省内存可能不是一个好主意,因为它是以牺牲执行速度为代价的。
作为旁注,您的代码将无法在标准C编译器上编译,因为在C语言中没有名为“strrev”的函数。这是一个非标准的扩展,因此应该避免。
答案 3 :(得分:0)
这很简单。只需从包含开头引号的字符串开始:
char my_str[100] = "\"";
strcat(my_str, "Hello, world!");
strcat(my_str, "\"");
或者,如果您不想以这种方式初始化字符串,只需复制开头的引用:
char my_str[100];
strcpy(my_str, "\"");
strcat(my_str, "Hello, world!");
strcat(my_str, "\"");
答案 4 :(得分:-1)
有一种更简单的方法 - 只需将现有字符串移动所需的空间量,即可为要添加的字符串腾出空间。由于内存的源和目标区域重叠,您无法使用strcpy
或memcpy
,而是必须使用memmove
memmove(my_str+1,my_str,strlen(my_str)+1);
然后用双引号替换第一个字符。
my_str[0]='\"';