저는 C 프로그래밍을 처음 접했고 int 앞에 텍스트를 넣는 char을 만들고 싶습니다.C에서 int로 char 초기화하기
char charPin[] = ("PIN%d",pin);
외부 기능에 charPin
을 전달하고 싶습니다. 라인의 시작 부분에 유효하지 않은 초기화 프로그램이 나타납니다.
저는 C 프로그래밍을 처음 접했고 int 앞에 텍스트를 넣는 char을 만들고 싶습니다.C에서 int로 char 초기화하기
char charPin[] = ("PIN%d",pin);
외부 기능에 charPin
을 전달하고 싶습니다. 라인의 시작 부분에 유효하지 않은 초기화 프로그램이 나타납니다.
당신이 찾고있는 것은 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);
을 사용할 수 있습니다.
상수 값으로 문자 배열을 초기화하려는 경우 문자열 리터럴에 PIN 번호 (본 예에서는 52 개)를 쓸 수 있습니다.
char charPin[] = "PIN52";
'snprintf'는 배열을 초기화하는 데 사용할 수 없습니다. – Olaf
그 다음 나의 예에서 나는 무엇을하고 있는가? https://en.wikipedia.org/wiki/Initialization_(programming) - 초기화는 한 줄 값 지정을 의미하지 않으며 배열은 여러 작업을 사용하여 초기화 될 수 있으며 여전히 "초기화"로 간주됩니다. – Jezor
'resultSize'를 초기화하는 동안에는 배열을 초기화하지 않고 쓰기 만합니다. 표준은 초기화가 무엇인지 매우 분명합니다. 정적 변수에 대한 코드를 사용하여 Typ. – Olaf
귀하의 문은
는 표현char charPin[] = ("PIN%d",pin);
("PIN%d",pin)
와
char
의 지정되지 않은 길이의 배열을 초기화하려고합니다. 이 표현식은 Pythonesque로 보이지만 C에서 구문 적으로 유효합니다. 괄호는 쉼표 (
,
) 연산자와 관련된 표현식을 중심으로 일반 그룹화 기능을 수행합니다. 실제로 해당 표현식을 허용하는 컨텍스트에서 평가 된 결과는
pin
과 동일한 유형 및 값을 갖습니다. 그것은 당신이 의도 한 바가 아니며 운좋게도 문제는 컴파일러가 원하지 않는 일을하기 위해 코드를 생성하는 것과는 대조적으로 컴파일러가 거부하는 유형입니다.
두 가지 형태 중 하나를 취할 수 char
배열의 초기화 :
어느 쪽도 용도에 적합하지 않으므로 선언 내용과 별도로 원하는 내용으로 배열을 채워야합니다. 또한 배열의 명시적인 크기를 선언해야 함을 의미합니다. 정수 부분 (크기가 가변적이고 제한 범위 내)과 1 바이트 문자열 종결 자에 대해 텍스트 부분 (크기는 알고있는 부분)의 공간이 필요합니다.
pin
의 데이터 유형 (int
?)이 64 비트보다 넓지 않다는 가정하에 최대 19 자리의 십진수 + 부호가 있으면 20 문자로 충분하므로 전체 문자열에 대해 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
}
당신은 불완전한 배열 상수 initialiser 필요 : 우리는 또한 일반적으로 우리가 에 대한 오류 신호를 수있는 모든 함수 호출을해야로서, 일반적인 오류 코드를 확인 할 것 실행시의 사이즈 따라서 핀 번호 변수를 쉽게 사용할 수 없습니다.
당신이 일정한 핀, 다음 작품을 살 수있는 경우 :
#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) ...
당신은 단지 하나의 매크로 정의를 변경하여 텍스트를 변경할 수 있습니다 그 방법 :
더 유용한 예제는 핀 번호 변수화하고 나머지 텍스트를 생성하는 매크로를 사용하는 woud , 예. 다른 언어 :
#define PIN(n) STRINGIZE(Anschluss, n)
변수가 필요한 경우 더 많은 노력을 기울여야합니다. 그러나 이것이 원하는 텍스트의 예인 경우 일부 배열에 저장하는 대신 출력하려는 나머지 텍스트와 함께 즉시 이름을 생성하는 것이 더 쉬울 수도 있습니다.
최상의 코드는 제공하지 않은 컨텍스트에 따라 다릅니다.
sprintf_s 기능을 확인하십시오. –
'pin'은'int'입니까? 'pin'의 값이'42' 인 경우,'charPin'의 값을''PIN42 "'로하고 싶습니까? 그렇다면 질문을 명확하게 업데이트하십시오. 우리에게'pin'의 선언을 보여 주시고'pin'의 주어진 값에 대해'charPin'이 갖길 원하는 가치를 말해주십시오. 처음에 무엇을 성취하려고하는지 명확하게 밝히지 않고는 문제를 해결할 수 없습니다. –