在C中用int初始化字符
我是C编程新手,希望创建一个字符,将文本置于int之前在C中用int初始化字符,c,char,C,Char,我是C编程新手,希望创建一个字符,将文本置于int之前 char charPin[] = ("PIN%d",pin); 我需要它,这样我就可以将charPin传递给外部函数。我在行首收到一个无效的初始值设定项。您要查找的是函数。 首先,您必须声明一个足够大的数组来存储结果(因此在我的示例中,我使用50个字符的固定大小),然后使用函数用格式化数据初始化它。您不必使用strlen检查结果字符串的长度,因为sprintf已经返回了它 size_t arraySize = 50; char charP
char charPin[] = ("PIN%d",pin);
我需要它,这样我就可以将
charPin
传递给外部函数。我在行首收到一个无效的初始值设定项。您要查找的是函数。
首先,您必须声明一个足够大的数组来存储结果(因此在我的示例中,我使用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
}
你要找的是函数。 首先,您必须声明一个足够大的数组来存储结果(因此在我的示例中,我使用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
}
你的陈述
正在尝试用表达式(“PIN%d”,PIN)
初始化未指定长度的字符数组。该表达式看起来像pythonnesque,但在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
}
if(结果>=引脚缓冲区大小){
fprintf(stderr,“管脚截断\n”);
退出(退出失败);//或者以不太激烈的方式处理它
}否则如果(结果<0){
//不应该发生,但我们正在彻底调查
fprintf(stderr,“内部I/O错误”);
退出(退出失败);//或者以不太激烈的方式处理它
}
您的声明
正在尝试用表达式(“PIN%d”,PIN)
初始化未指定长度的字符数组。该表达式看起来像pythonnesque,但在C中在语法上是有效的:括号围绕一个包含逗号(,
)运算符的表达式执行其普通分组函数。在实际允许该表达式的上下文中进行计算,结果的类型和值将与pin
相同。这根本不是您想要的,幸运的是,问题属于编译器拒绝的类型,而不是编译器生成代码来执行您实际要求它执行的意外操作的类型
char
数组的初始值设定项可以采用以下两种形式之一:
- 字符串或UTF-8文本,或
- 单个元素的大括号封闭数组
这两种方法都不适合您的目的,因此您必须用所需的内容填充数组,而不是声明。此外,这意味着您必须为数组声明一个显式大小。您需要为文本部分(您知道其大小)、整数部分(其大小是可变的,在限制范围内)和单字节字符串终止符留出空间
如果您愿意做出非常合理的假设,即pin
的数据类型(int
?)的宽度不超过64位,那么20个字符就足以容纳最多可能的19个十进制数字加上一个符号,因此24个字符就足以容纳整个字符串。通常最好避免在代码中使用幻数,因此您可以这样声明charPin
:
#define PIN_BUFFER_SIZE 24
// ...
char charPin[PIN_BUFFER_SIZE];
有几种方法可以填充数组内容集,但最简单的方法是使用sprintf()
或snprin
#define PIN(n) STRINGIZE(PIN, n)
// usage:
... PIN(10) ...
#define PIN(n) STRINGIZE(Anschluss, n)