왜 이러한 차이점이 있습니까? 나는 itoa
이 stdlib.h
에 있고, 다른 프로토 타입으로 itoa
의 커스텀 버젼을 연결하고 결과적으로 미친 오류를내는 것으로 끝내는 끔찍한 문제들에 착륙했습니다.atoi는 표준 기능입니다. 그러나 itoa는 그렇지 않습니다. 왜?
따라서 itoa
은 표준 기능이 아닙니까? 그게 뭐가 잘못 됐어? 그리고 표준은 왜 그 쌍둥이 형제에게 부분적입니까 atoi
?
왜 이러한 차이점이 있습니까? 나는 itoa
이 stdlib.h
에 있고, 다른 프로토 타입으로 itoa
의 커스텀 버젼을 연결하고 결과적으로 미친 오류를내는 것으로 끝내는 끔찍한 문제들에 착륙했습니다.atoi는 표준 기능입니다. 그러나 itoa는 그렇지 않습니다. 왜?
따라서 itoa
은 표준 기능이 아닙니까? 그게 뭐가 잘못 됐어? 그리고 표준은 왜 그 쌍둥이 형제에게 부분적입니까 atoi
?
아니요 itoa
은 표준에 추가되었으므로 추가할만한 이유와 훌륭한 인터페이스가 필요합니다.
대부분의 경우 인터페이스는 재진입 및 수명 문제가있는 정적 버퍼를 사용하거나 호출자가 무료로 제공해야하는 동적 버퍼를 할당하거나 사용자가 인터페이스를 더 좋게 만드는 버퍼를 제공하도록 요구합니다. sprintf
.
itoa()가 버퍼에 전달되면 sf (n) printf()에서 그 라이브러리의 특정 부분 (printf() 패밀리에서는 아무것도 사용하지 않음)이 사용되지 않을 때 큰 이점이 될 수 있습니다. 이것이 표준 C 라이브러리에 itoa()를 넣는 이유는 아니지만 훨씬 무거운 것을 선호하는 이유입니다. –
@JulieinAustin : 왜 큰 승리입니까? 사실, 두 개의 문자 형식 문자열을 구문 분석 할 필요는 없지만 _huge_이라는 점을 고려하지는 않습니다. –
printf() 패밀리가 탑재 된 다른 파싱 함수도 모두 피할 수 있습니다. 기억하십시오 - 형식 문자열을 구문 분석하는 것 외에도이 세상에는 다른 것들이 있습니다. 마찬가지로, 메모리 사용량. –
"itoa"함수는 문자열을 반환해야합니다. 문자열은 최상위 클래스 객체가 아니기 때문에 호출자는 버퍼 + 길이를 전달해야하며 함수는 공간이 부족한 지 여부를 나타내는 방법이 있어야합니다. 그 정도까지는 sprintf와 비슷한 것을 만들었으므로 코드/기능을 복제 할 필요가 없습니다. "atoi"기능은 완전한 "scanf"호출보다 덜 복잡하고 틀림없이 더 안전하기 때문에 존재합니다. "itoa"기능은 그만한 가치가 있기에 충분하지 않습니다.
아닙니다. 많은 개발자들이 수년 동안 itoa()와 같은 루틴을 코드에 포함 시켰습니다. 최대 버퍼 크기는 16 바이트의 경우 6 바이트, NUL의 경우 여유 공간이 있고 32 비트의 경우 11 비트가 여분입니다. 필자는 데이터 수집 펌웨어에서 itoa() 함수를 사용하여 버전 및 상태 정보를 포함하는 텍스트 문자열을 형식화합니다. 그 구현에서 나는 포인터를 전달하지만 다른 사람들은 버퍼가 정적 인 것을 보았다. 가장 좋은 설명은 표준과 마찬가지로 여러 가지 itoa() 구현 중에서 선택할 수 있다는 것입니다. –
@JulieinAustin - 나는 그들이 존재하지 않는다고 말하는 것이 아니라 단지 표준화되어 있지 않다는 것입니다. 귀하의 설명은 그 이유를 보여줍니다. 버퍼 크기는 기계의 레지스터 크기에 따라 다릅니다. C 표준위원회는 이와 같은 하드웨어 관련 세부 사항에서 벗어납니다. 표준화 된 함수는 일관된 인터페이스를 가져야하고 ** ** 모든 플랫폼에서 동일하게 작동해야하며이를 수행하는 유일한 실제 방법은'printf()'의 대부분을 재 작성하는 것입니다. – bta
나는이 함수가 모든 종류의 일을 할 것이라고 주장했다. 실제로는 그렇지 않으며 적절한 크기의 족제비 단어를 사용하여 구현이 쉽게 지정되어 단어 크기 차이를 해결할 수 있습니다. 즉, 임의의 주어진 단어 크기에 대해, 그 단어 크기에 대해 모든 가능한 정수 값을 나타 내기 위해 필요한 기억 문자의 잘 알려진 유한 문자 수가 있습니다. TL; DR - 제안 할 수있는 것보다 훨씬 쉽고 일관되게 구현할 수 있습니다. –
itoa
기능이 표준이 아닐 수 있습니다. 일관된 정의가 없기 때문일 수 있습니다. 서로 다른 컴파일러 및 라이브러리 공급 업체가 미묘하게 다른 버전을 도입했습니다. atoi
을 보완하는 역할을하는 발명품 일 수 있습니다.
일부 비표준 기능이 공급 업체에서 널리 제공되는 경우 표준 작업은 으로 코드화됩니다. 기본적으로 기존 기능에 대한 설명을 표준에 추가하십시오. 함수가 다소 일관된 인수 규칙 및 동작을 갖는 경우 가능합니다.
itoa
의 여러 가지 맛이 이미 나와 있기 때문에 이러한 기능을 ISO C에 추가 할 수 없습니다. 어떤 동작이든 구현에 따라 다소 차이가있을 수 있습니다.
void itoa(int n, char *s); /* Given in _The C Programming Language_, 1st ed. (K&R1) */
void itoa(int input, void (*subr)(char)); /* Ancient Unix library */
void itoa(int n, char *buf, int radix);
char *itoa(int in, char *buf, int radix);
마이크로 소프트가 변경된 이름으로 자신의 비주얼 C 런타임 라이브러리를 제공합니다 : _itoa
itoa
itoa
함수라는 기능을 제공한다.
기본적으로 itoa
식별자는 외부 이름 또는 매크로로 표준화와 관련하여 "방사성"입니다. 이러한 기능이 표준화 된 경우 다른 이름을 사용해야합니다.
'atoi'는 역사적으로 'itoa'는 아닙니다. 어쨌든'atoi '를 사용하면 안됩니다.'strto (l) l (l)'을 사용해야합니다. 다른 방향의 경우,'s (n) printf'. –
'itoa'는 표준 함수가 아니기 때문에 당신이 논의하고자하는'itoa' 함수에 대한 인터페이스 계약을 포함시킬 수 있습니까?(이 작업을 수행하면 질문에 대한 답변을 얻을 수 있습니다.) –
@CharlesBailey 표준에 atoi가 포함되어 있고 itoa가 아닌 이유에 대해 궁금합니다. –