创建C字符串的最佳方法

时间:2010-06-14 09:53:46

标签: c++ c string

我正在使用

char *thisvar = "stringcontenthere";

在C中声明一个字符串。

这是在C中声明字符串的最佳方法吗?

如何从C ++生成C-String?字符串?

5 个答案:

答案 0 :(得分:13)

在C中,它取决于你将如何使用字符串:

  • 命名常量:您的char* str = "string";方法正常(但应该是char const*
  • 要传递给子函数的数据,但在调用函数返回后不会使用:
    char str[] = "string";
  • 将在退出时声明的函数之后使用的数据:char* str = strdup("string");,并确保最终获得free d。

如果没有覆盖它,请尝试在答案中添加更多细节。

答案 1 :(得分:1)

const char *thisvar="stringcontenthere";

答案 2 :(得分:1)

正如其他人建议的那样,我想以C++的方式“执行”,请使用std::string

如果您需要某个C-stringstd::string的方法会产生const char*

以下是一个例子:

#include <iostream>
#include <string>

void dummyFunction(const char* str)
{
  // Do something
}

int main(int, char**)
{
  std::string str = "hello world!";

  dummyFunction(str.c_str());

  return EXIT_SUCCESS;
}

答案 3 :(得分:1)

这取决于。对于ASCII编码的字符串,请参阅段落C和C ++。对于unicode编码的字符串,请参阅最后一段。

C:

正如大卫指出的那样取决于如何在C:

中使用字符串
  • 作为常数然后:const char s[] = "Hello World";
  • 作为包含可变数据的字符串,然后:char s[] = "Hello World";
  • 作为数据数组char *data;然后应该定制初始化。

请注意在C中有所有字符串空终止,这意味着例如char s[] = "foo";隐含地在末尾NULL包含s[3]='\0'个字符。

另请注意char *schar s[]之间的微妙差异,这些差异可能通常表现相同,但有时并非如此! (参见Is an array name a pointer?)例如:

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char* argv[])
{
  char s[] = "123456789123456789123456789";
  char *t = (char*) malloc( sizeof(char) * 28 );
  for( size_t i = 0; i < 28; ++i )
      t[ i ] = 'j';
  printf( "%lu\n", sizeof(s) );
  printf( "%lu\n", sizeof(t) );
  printf( "%s\n", s );
  printf( "%s\n", t );
  return EXIT_SUCCESS;
}

因此,无论何时将char数组用作数据数组,我都建议使用char数组作为字符串和char指针。

C ++:

在C ++中有一个自己的字符串数据类型:std::string。如果你只需要一个st-:: string的C-String版本(例如使用一些C-API),只需使用c_str()成员:

std::string s = "Hello World";
your_c_call( s.c_str(), ... );

的Unicode:

我想拥有unicode字符串,那么你应该选择像

这样的东西
char utf8String[] = u8"Hello World";

尽量不要使用wchar_t。请参阅有关该问题的优秀文章:http://www.nubaria.com/en/blog/?p=289。请注意,还有对C ++的unicode支持。但一般来说,我很想说你应该尽可能地使用普通人物。有趣的资源:http://www.cprogramming.com/tutorial/unicode.html

答案 4 :(得分:0)

这是C还是C ++?在C ++中,您应该使用std::string

std::string aString("stringcontenthere");