创建C字符串的最佳方法

11

我目前正在使用

char *thisvar = "stringcontenthere";

如何在C中声明一个字符串?

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

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


2
请注意,这应该是const char *thisvar = "stringcontenthere";(额外的const)。从字符串字面值到char*存在隐式的const移除转换,但这已被弃用,不应使用。 - sbi
2
还要注意,char* foo; 定义 了一个变量(类型为 char*),而 char* foo="bar";定义并初始化 了一个变量。一个 声明 的例子是 extern char* foo;。(请参见 https://dev59.com/V3M_5IYBdhLWcg3wXx1N 了解什么是定义和声明。) - sbi
1
你应该澄清一下自己是否也对C++感兴趣,因为问题和主题中都没有提到C++标签。 - math
5个回答

16

对于C语言中的字符串,取决于它将如何使用:

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

如果这不能满足要求,请尝试添加更多详细信息。


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;
}

1
这要看情况。对于ASCII编码的字符串,请参阅C和C++段落。对于Unicode编码的字符串,请参阅最后一个段落。
C:
正如David所指出的,这取决于在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指针。
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。但一般来说,建议尽可能使用普通字符。有关此问题的有趣资源:http://www.cprogramming.com/tutorial/unicode.html


1
const char *thisvar="stringcontenthere";

它应该读作 thisvar = "stringcontenthere",并且应该是 const char*。 - frast
那么它应该被命名为 const char *thisconst="stringcontenthere"; SCNR; - math

0
这是 C 还是 C++?在 C++ 中,你应该使用 std::string
std::string aString("stringcontenthere");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接