【问题标题】:how to create a string literal as a function argument via string concatenation in c如何通过c中的字符串连接创建字符串文字作为函数参数
【发布时间】:2010-04-09 20:31:05
【问题描述】:

我需要将字符串文字传递给函数

myfunction("arg1" DEF_CHAR "arg1");

现在构造的字符串文字的一部分需要是函数返回

stmp = createString();
myfunction("arg1" stmp "arg2"); //oh that doesn't work either

有什么方法可以在一行中做到这一点吗?

myfunction("arg1" createString() "arg2"); //what instead?

注意:请仅使用 C。

我的目标是避免为此初始化一个新的字符数组 =/

【问题讨论】:

  • 这完全不可能。如果字符串是在运行时创建的,则根据定义,它不是字符串文字。
  • 字符串文字连接只是真正存在,因为长字符串很常见,如果没有它来定义它们会很痛苦。您可以在一条凌乱的行中做您想做的事,但不能不为其分配内存。

标签: c string concatenation argument-passing literals


【解决方案1】:

您不能在运行时构建字符串文字,但您可以创建字符串,如下所示:

char param[BIG_ENOUGH];

strcpy(param, "arg1");
strcat(param, createString());
strcat(param, "arg2");
myfunction(param);

【讨论】:

  • 事实上,strcpy()strcat() 返回指向目标字符串的指针的原因正是针对这种情况 - 它可以让您执行 myfunction(strcat(strcat(strcpy(param, "arg1"), createstring()), "arg2"))
  • @caf 谢谢,不知道。
【解决方案2】:
char buffer[1024] = {0};
//initialize buffer with 0 
//tweak length according to your needs

strcat(buffer, "arg1");
strcat(buffer, createString()); //string should be null ternimated
strcat(buffer, "arg2");

myfunction(buffer);

【讨论】:

    【解决方案3】:

    C 不支持动态字符串,因此您尝试的操作是不可能的。 createString() 函数的返回值是一个变量,而不是文字,因此您不能将它与其他文字连接。话虽如此,如果将它放在一行中对您来说真的很重要,您可以创建一个辅助函数来促进这一点,如下所示:

    char * my_formatter( const char * format, ... )
    {
    ...
    }
    
    myfunction(my_formatter("arg1%sarg2", createString()));
    

    但是,这种方法存在一些内存管理和线程安全问题。

    【讨论】:

      【解决方案4】:

      你需要为此创建一个字符数组;编译器仅连接字符串文字。

      【讨论】:

        【解决方案5】:

        不。如果不分配新缓冲区来连接字符串,则无法在纯 C 中执行此操作。

        【讨论】:

          猜你喜欢
          • 2014-06-13
          • 2020-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-19
          • 2018-03-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多