【问题标题】:Building Strings from variables in C从 C 中的变量构建字符串
【发布时间】:2011-06-20 09:31:27
【问题描述】:

我正在开发一个使用套接字的基本 Blackjack 游戏,由我的操作系统课程提供。 我们已经获得了一个套接字接口,它可以来回传递一个字符数组。

我曾希望我可以做这样的事情:

char[] msgOut = printf("Dealer's Card is %C %C", char1, char2);
sendMsg(msgOut);

但是,谷歌搜索导致我确定 printf 的返回值是 Char 输出数量的 int,不是字符本身的 char[](正如我所希望的那样)。

还有其他 C 函数可以让我从变量中构建字符串吗?

【问题讨论】:

    标签: c string printf


    【解决方案1】:

    printf 写入标准输出。 snprintf 完成了你在这里的目标。调用 snprintf 后,内插字符串存储在“缓冲区”中。您可能希望更智能地定义缓冲区大小,但这只是一个示例。

    char buffer[1024];
    snprintf(buffer, sizeof(buffer), "Dealer's Card is %C %C", char1, char2);
    

    【讨论】:

    • 不,看例子。缓冲区将被修改到位。 C 中的许多函数返回错误代码并就地修改它们的参数。你必须习惯用 C 编写代码。
    • 是的。我的目光短浅。写完评论后,我重新阅读了您的回答。
    • @EdS.:你如何附加到buffer。假设我想在buffer 上多次调用snprintf,但不希望buffer 中的文本被覆盖。
    • @arunmoezhi:传入指向缓冲区内某个偏移量的指针,即buffer + n, sizeof(buffer) - n
    • @EdS.: 我应该在每次通话后增加n
    【解决方案2】:

    Glibc(和其他几个 C 库)有一个方便的函数 asprintf

    char *msgOut;
    asprintf(&msgOut, "Dealer's Card is %C %C", char1, char2);
    sendMsg(msgOut);
    free(msgOut);
    

    当您对保存字符串所需的内存量没有很好的预先预测时,这非常有用。 (如果这样做,snprintf 的开销会更少,因为它不会动态分配内存。)

    在没有asprintf 但具有符合标准的snprintf 的系统上,它可以通过两次调用snprintf 来实现——首先没有缓冲区和零大小来确定字符串长度,中间是malloc ,然后第二次使用新分配的空间。

    【讨论】:

      【解决方案3】:

      如果您想要一个动态分配内存的 c 字符串构建器,我发现 http://linux.die.net/man/3/vasprintf 很有用。

      例子:

      #include <stdio.h>
      
      int i;
      printf("//Simple dynamic string builder:\n");
      char *strs[6] = {"I","am","an","array","of","strings"};
      
      char *buf = "["; // open bracket
      for (i=0;i<6;i++) {
          // Dynamically build and allocate memory
          asprintf(&buf,"%s%s",buf,strs[i]);
          if(i!=5) { // Add a comma , after each but skip the last
              asprintf(&buf,"%s,",buf);
          }
      }
      asprintf(&buf,"%s]",buf); // closing backet
      printf("\"%s\"\n",buf);
      

      输出是

      //Simple string builder:
      "[I,am,an,array,of,strings]"
      

      所以char *bufasprintf 动态扩展,并通过将自身格式化为asprintf 语句来构建。

      【讨论】:

      • 请注意 asprintf 是 GNU 扩展,而不是 C/POSIX 事实方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 2014-12-02
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多