我是C编程的新手,想创建一个将文本放在int之前的字符。
char charPin[] = ("PIN%d",pin);
我想要它,所以我可以将charPin
传递给外部函数。我在行的开头收到了无效的初始值设定项。
答案 0 :(得分:2)
对于不完整的数组,您需要一个常量初始化器,因此编译器可以在运行时确定大小。因此,不太可能将变量用于引脚号。
如果您可以使用常量引脚,则可以使用以下方法:
#define STRINGIZE(x) #x
#define CONCAT(a,b) STRINGIZE(a##b)
static const char p10[] = CONCAT(PIN, 10);
int main(void)
{
printf("%s\n", p10);
return 0;
}
#
产生用引号括起来的参数,连接运算符##
将两个参数连接到一个参数。它们是预处理程序运算符,这是因为它不适用于变量。
一个更有用的例子是仅对引脚编号进行参数化,并使用宏来生成文本的其余部分:
#define PIN(n) STRINGIZE(PIN, n)
// usage:
... PIN(10) ...
通过这种方式,您只需更改单个宏定义即可更改文本,例如对于另一种语言:
#define PIN(n) STRINGIZE(Anschluss, n)
如果您需要变量,则必须付出更多努力。但是,如果这是您想要获取的文本的示例,则可能更容易在运行时生成名称以及要输出的其余文本,而不是存储到某个数组中。
最佳代码取决于您未提供的上下文。
答案 1 :(得分:1)
您的陈述
char charPin[] = ("PIN%d",pin);
正在尝试使用表达式char
初始化未指定长度的("PIN%d",pin)
数组。该表达式看起来像Pythonesque,但它在C语法上是有效的:括号在涉及逗号(,
)运算符的表达式周围执行它们的普通分组函数。在实际允许该表达式的上下文中进行评估,结果将具有与pin
相同的类型和值。这根本不是你想要的,幸运的是问题是编译器拒绝的类型,而不是编译器生成代码以执行你实际告诉它的非预期事情的类型。
char
数组的初始化程序可以采用以下两种形式之一:
这些都不符合您的目的,因此您必须将其所需内容与其声明分开填充。而且,这意味着您必须为数组声明一个显式大小。对于整数部分(其大小可变,在限制范围内)和单字节字符串终止符,您需要空间用于文本部分(您知道它的大小)。
如果您愿意做出pin
数据类型(int
?)不超过64位的合理假设,那么20个字符就足够了对于最大可能的19个十进制数字加上一个符号,因此对于整个字符串应该有24个字符就足够了。通常最好避免在代码中使用魔术数字,因此您可以像这样声明charPin
:
#define PIN_BUFFER_SIZE 24
// ...
char charPin[PIN_BUFFER_SIZE];
您可以通过多种方式填充数组内容,但最简单的方法是使用sprintf()
或snprintf()
。假设我们对我们的大小计算不完全有信心,或者文本部分是可变的。然后我们可以在charPin
中声明比我们认为我们需要的更多的空间,但最终我们要确保我们不会覆盖数组的边界。 snprintf()
旨在实现此目的:
int result = snprintf(charPin, PIN_BUFFER_SIZE, "PIN%d", pin);
这是基本的答案,但是一个细心的程序员不会放弃它。假设我们希望在我们关于所需空间的假设是错误的情况下被警告,而不是仅仅让数据被截断,我们想要测试函数的返回值并处理它指示的任何错误。我们还想检查一般错误代码,通常我们应该为每个函数调用做一个可以发出错误信号的函数:
if (result >= PIN_BUFFER_SIZE) {
fprintf(stderr, "PIN truncated\n");
exit(EXIT_FAILURE); // or handle it some less-drastic way
} else if (result < 0) {
// should not happen, but we're being thorough
fprintf(stderr, "Internal I/O error\n");
exit(EXIT_FAILURE); // or handle it some less-drastic way
}
答案 2 :(得分:0)
您正在寻找的是sprintf
功能。
首先,你必须声明一个足够大的数组来存储结果(which might not be easy,所以在我的例子中我使用50个字符的固定大小),然后使用你用格式化数据初始化它的函数。您不必使用strlen
检查结果字符串的长度,因为sprintf
已经返回它。
size_t arraySize = 50;
char charPin[arraySize];
int resultSize = sprintf(charPin, "PIN%d", pin);
如果sprintf失败,resultSize将为负值。您可以使用
处理它if (resultSize < 0) {
// react to failure here
}
现在要打印结果,您可以使用printf("%s", charPin);
。
如果您尝试使用常量值初始化char数组,则只需在字符串文字中写入PIN码(在我的示例中为52)。
char charPin[] = "PIN52";