【问题标题】:Best way to create a C String创建 C 字符串的最佳方法
【发布时间】: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;。 (有关什么是定义和什么是声明,请参阅stackoverflow.com/questions/1410563/1410632#1410632。)
  • 你应该澄清你是否也对 C++ 感兴趣,因为 C++ 标签在问题和主题中都没有发现任何通知。

标签: c++ c string


【解决方案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");
        

        【讨论】:

          猜你喜欢
          • 2011-02-13
          • 2011-04-28
          • 1970-01-01
          • 2011-06-02
          • 2016-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多