Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中用int初始化字符_C_Char - Fatal编程技术网

在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

我是C编程新手,希望创建一个字符,将文本置于int之前

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)