在C中动态构造char

时间:2014-07-24 11:00:07

标签: c string strcpy

我正在尝试构建一个具有一系列我想要在其中构建的角色的数组,这些字符就像这样\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

3 个答案:

答案 0 :(得分: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 :(得分: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 :(得分:0)

符号"\x01"是一种告诉编译器的方法&#34;当您创建常量来表示此字符串文字时,请将我替换为具有数字值{{0}的字符。 1}}#&34; 反斜杠(和1)甚至没有进入已编译的模块。如果你想要一个字符串中某个(动态)数值的字符,只需追加该数值(转换为x)到字符串。约阿希姆给了你一些想法。

char符号只是一个方便&#34;当你有一些固定的数值时,你希望插入一个字符串文字。