2016-06-19 8 views
-1

저는 C 프로그래밍을 처음 접했고 int 앞에 텍스트를 넣는 char을 만들고 싶습니다.C에서 int로 char 초기화하기

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

외부 기능에 charPin을 전달하고 싶습니다. 라인의 시작 부분에 유효하지 않은 초기화 프로그램이 나타납니다.

+3

sprintf_s 기능을 확인하십시오. –

+1

'pin'은'int'입니까? 'pin'의 값이'42' 인 경우,'charPin'의 값을''PIN42 "'로하고 싶습니까? 그렇다면 질문을 명확하게 업데이트하십시오. 우리에게'pin'의 선언을 보여 주시고'pin'의 주어진 값에 대해'charPin'이 갖길 원하는 가치를 말해주십시오. 처음에 무엇을 성취하려고하는지 명확하게 밝히지 않고는 문제를 해결할 수 없습니다. –

답변

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);을 사용할 수 있습니다.

상수 값으로 문자 배열을 초기화하려는 경우 문자열 리터럴에 PIN 번호 (본 예에서는 52 개)를 쓸 수 있습니다.

char charPin[] = "PIN52"; 
+0

'snprintf'는 배열을 초기화하는 데 사용할 수 없습니다. – Olaf

+0

그 다음 나의 예에서 나는 무엇을하고 있는가? https://en.wikipedia.org/wiki/Initialization_(programming) - 초기화는 한 줄 값 지정을 의미하지 않으며 배열은 여러 작업을 사용하여 초기화 될 수 있으며 여전히 "초기화"로 간주됩니다. – Jezor

+0

'resultSize'를 초기화하는 동안에는 배열을 초기화하지 않고 쓰기 만합니다. 표준은 초기화가 무엇인지 매우 분명합니다. 정적 변수에 대한 코드를 사용하여 Typ. – Olaf

1

귀하의 문은

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

는 표현 ("PIN%d",pin)char의 지정되지 않은 길이의 배열을 초기화하려고합니다. 이 표현식은 Pythonesque로 보이지만 C에서 구문 적으로 유효합니다. 괄호는 쉼표 ( ,) 연산자와 관련된 표현식을 중심으로 일반 그룹화 기능을 수행합니다. 실제로 해당 표현식을 허용하는 컨텍스트에서 평가 된 결과는 pin과 동일한 유형 및 값을 갖습니다. 그것은 당신이 의도 한 바가 아니며 운좋게도 문제는 컴파일러가 원하지 않는 일을하기 위해 코드를 생성하는 것과는 대조적으로 컴파일러가 거부하는 유형입니다.

두 가지 형태 중 하나를 취할 수 char 배열의 초기화 :

  • 문자열 또는 리터럴 UTF-8 또는 개별 소자
  • 브레이스 둘러싸인 어레이.

어느 쪽도 용도에 적합하지 않으므로 선언 내용과 별도로 원하는 내용으로 배열을 채워야합니다. 또한 배열의 명시적인 크기를 선언해야 함을 의미합니다. 정수 부분 (크기가 가변적이고 제한 범위 내)과 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 
} 
2

당신은 불완전한 배열 상수 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) 

변수가 필요한 경우 더 많은 노력을 기울여야합니다. 그러나 이것이 원하는 텍스트의 예인 경우 일부 배열에 저장하는 대신 출력하려는 ​​나머지 텍스트와 함께 즉시 이름을 생성하는 것이 더 쉬울 수도 있습니다.

최상의 코드는 제공하지 않은 컨텍스트에 따라 다릅니다.