是否有一个内置函数,从字符串开始就像strcat一样?

时间:2017-12-14 11:28:07

标签: c++ c string

我有一个字符串,我想用引号包围。

到目前为止我所拥有的是:

#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字符串)也没关系

5 个答案:

答案 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_strstrcpy。您甚至可以将其放入一行代码中:

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)

有一种更简单的方法 - 只需将现有字符串移动所需的空间量,即可为要添加的字符串腾出空间。由于内存的源和目标区域重叠,您无法使用strcpymemcpy,而是必须使用memmove

memmove(my_str+1,my_str,strlen(my_str)+1);

然后用双引号替换第一个字符。

my_str[0]='\"';