2013-10-16 3 views
2

내부가 나는 코드의 비트 여기처럼이 :는 scanf : 매크로 (#DEFINE 상수)와 템플릿

#define MAXSIZE 100 

int main() { 
    char str[MAXSIZE+1]; 
    scanf("%100s", str); 
    ... 

MAXSIZE를 정의하지만, 문제는, 난 여전히 "매직 넘버"(100)을 가지고있다. scanf 형식 문자열에 MAXSIZE를 올바르게 "삽입"할 수 있습니까? (순수 C, C-99의 standart은)

+0

scanf를 사용해야합니까? 그렇지 않다면'fgets()'를 시도하십시오 – jev

답변

3

있습니다,하지만 당신은 fgets()를 사용하여 더 나을 것 : fgets()이 소요입니다

if (fgets(str, sizeof str, stdin) != NULL) { 
    // process input 
} 

(따로 의심 할 여지 가독성 향상에서) 이것에 대해 좋은 점 크기 을 올바르게 보 호하십시오. i. 이자형. 그것은 (버퍼가 선언 할 때 크기에 1을 더하는 것으로 해킹 할 필요가 없으므로) 종료 문자 0 문자 (scanf())를 설명합니다. 또한 NUL은 항상 배열을 종료합니다. 실수가 적어지는 경향이 있습니다. 원래의 질문에 관해서는


:

#define REAL_STRINGIFY(x) #x 
#define STRINGIFY(x) REAL_STRINGIFY(x) 

scanf("%" STRINGIFY(MAXSIZE) "s", str); 

그러나 그것은 매우 추한되지이다 : 보통 "캐릭터 라인 화"트릭을 시도?

+0

아주 못생긴! 아무도 그것에 대해 생각하고 싶지 않습니다. – haccks

+2

@ haccks 그러나 나는 그것을 좋아한다. :) 한 가지 방법은 OP가 새로운 매크로'#define MAX "를 선언 할 수 있다는 것이다. 100"' –

+0

@haccks. 역겹다. –