3 자리 숫자, 상태 및 널 문자에 대한 버퍼를 생성하려고합니다. 현재 내가 가지고3 자리 숫자 용 버퍼
char buf[4];
sprintf(buf, "%d",status);
내 질문이 waitpid()
3 자리 숫자, 상태 및 널 문자에 대한 버퍼를 생성하려고합니다. 현재 내가 가지고3 자리 숫자 용 버퍼
char buf[4];
sprintf(buf, "%d",status);
내 질문이 waitpid()
예에서 상태로 반환하는 3 자리 숫자에 대한 충분한 크기이지만, 사용자를 방지 아무것도 (또는 그러나 status
이 가득 여부 3 자리 숫자 이상으로 구멍을 뚫어 작은 버퍼가 넘치지 않도록합니다.
snprintf
기능
snprintf(buf, 4, "%d", status); // the 4 is the length of buf
예 : 3 개 문자/숫자와 후행줍니다.
미안보다 안전합니다.
안전을 원하면 정말로 3 자리 숫자인지 확인하십시오.
예를 들어 당신이 모드 연산자를 사용할 수 있습니다 :이 솔루션을 사용하는 경우가 snprintf
솔루션을 선택하고 1001을 주면, 당신은 100의 결과를 얻을거야
char buf[4];
sprintf(buf, "%d",status % 1000);
주, 당신은 얻을 것이다 1.
당신에게 더 적합한 것을 선택할 수 있습니다.
당신은 또한 결합 할 수 있습니다 모두 :
snprintf(buf, sizeof(buf), "%d",status % 1000);
당신은'snprintf'를 사용해야 만한다. 상태 값이 '-900'이라면 버퍼에 "-900 \ 0"을 가져옵니다. 이것은 한 문자가 너무 많습니다. – indiv
그것은 엄격하게 세 자리의 소수에 대한 안전하지만, waitpid()
는 그러한 보증하지 않습니다; 유형 pid_t
은 32 비트 부호있는 정수이며 3 자리 숫자는 다소 낙관적 인 가정으로 보입니다. Y
waitpid()
반환 값이 버퍼에 맞는지 확인하려면 범위를 확인해야하지만 일반적으로 메모리를 절약 할 필요는 없습니다. 12 문자의 버퍼는 모든 32 비트 부호있는 정수를 십진수 문자열 (최악의 경우 10 자리, 부호 문자 및 널 종결 자)로 나타낼 수 있습니다. 마찬가지로 16 비트에 대해, 일반적으로 7, 64 비트 사용 23을 사용
decimal_string_buffer_len = CEIL (로그 (2 는 sizeof (타입) * CHAR_BIT))를 + 3
'어떤 데이터 유형 status'입니까? C의 데이터 유형은 0-999의 범위를 보장하지 않습니다. 어떤 종류의 수 표를 추가해야합니다. status가'char' 인 경우 범위는 0-255입니다. 짧은 경우 (일반적으로) 0-2^16 (3 자리 숫자 아님). – Linuxios
@Linuxios status는 waitpid()의 반환 값입니다. – Apollo
waitpid는 신호에 의해 죽은 것과 같은 것을 나타 내기 위해 상위 비트에 다양한 플래그가 있기 때문에 훨씬 더 많이 반환 할 수 있습니다. 그럼에도 불구하고,'snprintf'는 항상 적어도 sprintf만큼 좋고 종종 더 나아지기 때문에 좋은 습관이 있습니다. –