在C中初始化一个带有int的char

时间:2016-06-19 21:22:13

标签: c char

我是C编程的新手,想创建一个将文本放在int之前的字符。

char charPin[] = ("PIN%d",pin);

我想要它,所以我可以将charPin传递给外部函数。我在行的开头收到了无效的初始值设定项。

3 个答案:

答案 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数组的初始化程序可以采用以下两种形式之一:

  • 字符串或UTF-8字面值,或
  • 一个括号括起来的单个元素阵列。

这些都不符合您的目的,因此您必须将其所需内容与其声明分开填充。而且,这意味着您必须为数组声明一个显式大小。对于整数部分(其大小可变,在限制范围内)和单字节字符串终止符,您需要空间用于文本部分(您知道它的大小)。

如果您愿意做出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";