创建 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");
,并确保最终得到free
d。
如果这没有涵盖它,请尝试在您的答案中添加更多细节。
【讨论】:
【参考方案2】:正如其他人建议的那样,我想以C++
方式“执行”,请使用std::string
。
如果您不知何故需要C-string
,std::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 *s
和char 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 字符串的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章