2014-11-20 4 views
0

3 자리 숫자, 상태 및 널 문자에 대한 버퍼를 생성하려고합니다. 현재 내가 가지고3 자리 숫자 용 버퍼

char buf[4]; 
sprintf(buf, "%d",status); 

내 질문이 waitpid()

+1

'어떤 데이터 유형 status'입니까? C의 데이터 유형은 0-999의 범위를 보장하지 않습니다. 어떤 종류의 수 표를 추가해야합니다. status가'char' 인 경우 범위는 0-255입니다. 짧은 경우 (일반적으로) 0-2^16 (3 자리 숫자 아님). – Linuxios

+0

@Linuxios status는 waitpid()의 반환 값입니다. – Apollo

+0

waitpid는 신호에 의해 죽은 것과 같은 것을 나타 내기 위해 상위 비트에 다양한 플래그가 있기 때문에 훨씬 더 많이 반환 할 수 있습니다. 그럼에도 불구하고,'snprintf'는 항상 적어도 sprintf만큼 좋고 종종 더 나아지기 때문에 좋은 습관이 있습니다. –

답변

5

예에서 상태로 반환하는 3 자리 숫자에 대한 충분한 크기이지만, 사용자를 방지 아무것도 (또는 그러나 status이 가득 여부 3 자리 숫자 이상으로 구멍을 뚫어 작은 버퍼가 넘치지 않도록합니다.

snprintf 기능

대신, 너무 긴 입력을 차단합니다 사용해야합니다

snprintf(buf, 4, "%d", status); // the 4 is the length of buf 
1

예 : 3 개 문자/숫자와 후행줍니다.

0

미안보다 안전합니다.

안전을 원하면 정말로 3 자리 숫자인지 확인하십시오.

예를 들어 당신이 모드 연산자를 사용할 수 있습니다 :이 솔루션을 사용하는 경우가 snprintf 솔루션을 선택하고 1001을 주면, 당신은 100의 결과를 얻을거야

char buf[4]; 
sprintf(buf, "%d",status % 1000); 

주, 당신은 얻을 것이다 1.

당신에게 더 적합한 것을 선택할 수 있습니다.

당신은 또한 결합 할 수 있습니다 모두 :

snprintf(buf, sizeof(buf), "%d",status % 1000); 
+1

당신은'snprintf'를 사용해야 만한다. 상태 값이 '-900'이라면 버퍼에 "-900 \ 0"을 가져옵니다. 이것은 한 문자가 너무 많습니다. – indiv

0

그것은 엄격하게 세 자리의 소수에 대한 안전하지만, waitpid()는 그러한 보증하지 않습니다; 유형 pid_t은 32 비트 부호있는 정수이며 3 자리 숫자는 다소 낙관적 인 가정으로 보입니다. Y

waitpid() 반환 값이 버퍼에 맞는지 확인하려면 범위를 확인해야하지만 일반적으로 메모리를 절약 할 필요는 없습니다. 12 문자의 버퍼는 모든 32 비트 부호있는 정수를 십진수 문자열 (최악의 경우 10 자리, 부호 문자 및 널 종결 자)로 나타낼 수 있습니다. 마찬가지로 16 비트에 대해, 일반적으로 7, 64 비트 사용 23을 사용

decimal_string_buffer_len = CEIL (로그 (2 는 sizeof (타입) * CHAR_BIT))를 + 3