我正在尝试构建一个具有一系列我想要在其中构建的角色的数组,这些字符就像这样\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
答案 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;当你有一些固定的数值时,你希望插入一个字符串文字。