【问题标题】:Dynamically construct a char in C在C中动态构造一个char
【发布时间】:2014-09-15 21:34:28
【问题描述】:

我正在尝试构建一个数组,其中包含一系列我想在运行中构建的字符,这些字符是这样的\x01\x02 等等。

例如,假设我们有:

#define NUMCOLORS 3
char delim[NUMCOLORS];

我们希望在delim 中有值\x01, \x02, \x03

我想到了两种可能的方法,但都导致了段错误:

for (int i = 0; i < NUMCOLORS; i++){
  char *h = "\x01";
  sprintf(h, "\x0%d", i+1);
  strcpy(delim[i], h);
}

// Other way

for (int i = 0; i < NUMCOLORS; i++){ 
  char *h = "\x0";
  strcpy(delim[i], h+1);
}

有什么方法可以创建我需要的char

【问题讨论】:

  • 您不能将sprintf 转换为h,因为它指向只读内存部分。您不能将strcpy 转换为delim[i],因为它是char,而不是char 指针!!!
  • 你知道strdup(3)吗?

标签: c string strcpy


【解决方案1】:
char *h = "\x01"; ( will place \x01 in the read-only parts of the memory )
sprintf(h, "\x0%d", i+1); // not valid 

这是指向常量字符串的指针。修改它是非法的。阅读我的answer

【讨论】:

    【解决方案2】:

    符号"\x01" 是一种告诉编译器“当您创建表示此字符串文字的常量时,将我替换为具有数值1 的字符。” 反斜杠(和x)甚至没有进入编译模块。如果你想要字符串中某个(动态)数值的字符,只需附加该数值(强制转换为char) 到字符串。 Joachim 给你一些想法。

    "\x01" 表示法只是一种“方便”,当您希望将某个固定数值插入字符串文字时。

    【讨论】:

      【解决方案3】:

      不,不要使用strcpy,因为它会添加字符串终止符。此外,执行h + 1 会为您提供h 指向的字符串中的下一个字符,即字符串终止符。

      而是使用字符实际上是整数值这一事实。这意味着您可以这样做,例如

      char delim[4];
      
      for (int i = 0; i < 3; ++i)
          delim[i] = i + 1;
      
      /* Terminates as string */
      delim[3] = '\0';
      

      现在您可以将delim 用作C 中的任何其他字符串,并包含字符串"\01\02\03"


      如果您希望字符串不包含 字符 '\01''\02' 等,那么您需要一个更大的数组,以及另一种构造字符串的方式:

      /* 3 sequences of 4 characters (backslash, x, two digits), plus terminator */
      char delims[3 * 4 + 1] = { 0 };  /* Initialize to zero (the string terminator) */
      
      for (int i = 0; i < 3; ++i)
      {
          char temp[5];  /* Place for 4 characters plus terminator */
          sprintf(temp, "\\x%02d", i);
      
          strcat(delims, temp);
      }
      

      现在字符串 delims 将包含字符串"\x01\x02\x03"。请注意,反斜杠是真正的反斜杠,而不是编译器将翻译的内容,如果您将字符串打印到控制台,输出将完全是反斜杠。

      【讨论】:

      • 但这只是用 1,2,3 填充 delim,我需要是 "\x01" "\x02" 和 "\x03"
      • @algui91 你想要一个 characters 数组还是 strings 数组?
      • @algui91 此外,整数值1 等于字符 文字'\01'
      • 让我们看看,我有一个字符串需要解析,例如。 "Hello, \x01 wolrd\x02", \x01 和 \x02 代表颜色,然后我需要 delim 为 "\x01\x02" 以便用 strtok 解析它。
      • @algui91 如果第一个有效,则第二个无效。当然,反之亦然。这两个变体构造不同的字符串,我将它们都包括在内是因为我不确定你想要什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 2018-11-26
      相关资源
      最近更新 更多