创建 C 字符串的最佳方法

Posted

技术标签:

【中文标题】创建 C 字符串的最佳方法【英文标题】:Best way to create a C String 【发布时间】:2010-06-14 09:53:45 【问题描述】:

我正在使用

char *thisvar = "stringcontenthere";

在 C 中声明一个字符串。

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

那么如何从 C++ 字符串生成 C 字符串?

【问题讨论】:

请注意,这应该是const char *thisvar = "stringcontenthere";(附加const)。存在从字符串文字到 char* 的隐式 const-removing 转换,但已弃用且不应使用。 还要注意char* foo;定义一个变量(char*类型)和char* foo="bar";定义和初始化一个变量。 声明extern char* foo;。 (有关什么是定义和什么是声明,请参阅***.com/questions/1410563/1410632#1410632。) 你应该澄清你是否也对 C++ 感兴趣,因为 C++ 标签在问题和主题中都没有发现任何通知。 【参考方案1】:

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

命名常量:你的char* str = "string";方法没问题(但应该是char const*) 要传递给子函数的数据,但调用函数返回后将不再使用:char str[] = "string"; 退出函数声明后使用的数据:char* str = strdup("string");,并确保最终得到freed。

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

【讨论】:

【参考方案2】:

正如其他人建议的那样,我想以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】:
const char *thisvar="stringcontenthere";

【讨论】:

必须是 thisvar = "stringcontenthere" 并且应该是 const char* 那么应该命名为const char *thisconst="stringcontenthere";SCNR;【参考方案4】:

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

C:

正如大卫指出的那样,这取决于如何在 C 中使用字符串:

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

请注意,在 C 中,所有字符串都是以 Null 结尾的,这意味着例如的定义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 指针。

C++:

在 C++ 中有一个自己的字符串数据类型:std::string。如果您只需要 std::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。但总的来说,我很想说你应该尽可能地使用普通字符。有趣的资源:@​​987654323@

【讨论】:

【参考方案5】:

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

std::string aString("stringcontenthere");

【讨论】:

以上是关于创建 C 字符串的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

从C#中的托管对象属性获取值的最佳方法

为 C 读取用户输入字符串的最佳方法? [复制]

创建 SEO 友好的 URI 字符串的最佳方法

从字符串创建 IPEndpoint 的最佳方法

在 C 中将字符串数组转换为 Int 数组的最佳方法

创建SEO友好URI字符串的最佳方法