2012-04-15 2 views
9

왜 이러한 차이점이 있습니까? 나는 itoastdlib.h에 있고, 다른 프로토 타입으로 itoa의 커스텀 버젼을 연결하고 결과적으로 미친 오류를내는 것으로 끝내는 끔찍한 문제들에 착륙했습니다.atoi는 표준 기능입니다. 그러나 itoa는 그렇지 않습니다. 왜?

따라서 itoa은 표준 기능이 아닙니까? 그게 뭐가 잘못 됐어? 그리고 표준은 왜 그 쌍둥이 형제에게 부분적입니까 atoi?

+11

'atoi'는 역사적으로 'itoa'는 아닙니다. 어쨌든'atoi '를 사용하면 안됩니다.'strto (l) l (l)'을 사용해야합니다. 다른 방향의 경우,'s (n) printf'. –

+0

'itoa'는 표준 함수가 아니기 때문에 당신이 논의하고자하는'itoa' 함수에 대한 인터페이스 계약을 포함시킬 수 있습니까?(이 작업을 수행하면 질문에 대한 답변을 얻을 수 있습니다.) –

+0

@CharlesBailey 표준에 atoi가 포함되어 있고 itoa가 아닌 이유에 대해 궁금합니다. –

답변

7

아니요 itoa은 표준에 추가되었으므로 추가할만한 이유와 훌륭한 인터페이스가 필요합니다.

대부분의 경우 인터페이스는 재진입 및 수명 문제가있는 정적 버퍼를 사용하거나 호출자가 무료로 제공해야하는 동적 버퍼를 할당하거나 사용자가 인터페이스를 더 좋게 만드는 버퍼를 제공하도록 요구합니다. sprintf.

+2

itoa()가 버퍼에 전달되면 sf (n) printf()에서 그 라이브러리의 특정 부분 (printf() 패밀리에서는 아무것도 사용하지 않음)이 사용되지 않을 때 큰 이점이 될 수 있습니다. 이것이 표준 C 라이브러리에 itoa()를 넣는 이유는 아니지만 훨씬 무거운 것을 선호하는 이유입니다. –

+0

@JulieinAustin : 왜 큰 승리입니까? 사실, 두 개의 문자 형식 문자열을 구문 분석 할 필요는 없지만 _huge_이라는 점을 고려하지는 않습니다. –

+2

printf() 패밀리가 탑재 된 다른 파싱 함수도 모두 피할 수 있습니다. 기억하십시오 - 형식 문자열을 구문 분석하는 것 외에도이 세상에는 다른 것들이 있습니다. 마찬가지로, 메모리 사용량. –

2

"itoa"함수는 문자열을 반환해야합니다. 문자열은 최상위 클래스 객체가 아니기 때문에 호출자는 버퍼 + 길이를 전달해야하며 함수는 공간이 부족한 지 여부를 나타내는 방법이 있어야합니다. 그 정도까지는 sprintf와 비슷한 것을 만들었으므로 코드/기능을 복제 할 필요가 없습니다. "atoi"기능은 완전한 "scanf"호출보다 덜 복잡하고 틀림없이 더 안전하기 때문에 존재합니다. "itoa"기능은 그만한 가치가 있기에 충분하지 않습니다.

+0

아닙니다. 많은 개발자들이 수년 동안 itoa()와 같은 루틴을 코드에 포함 시켰습니다. 최대 버퍼 크기는 16 바이트의 경우 6 바이트, NUL의 경우 여유 공간이 있고 32 비트의 경우 11 비트가 여분입니다. 필자는 데이터 수집 펌웨어에서 itoa() 함수를 사용하여 버전 및 상태 정보를 포함하는 텍스트 문자열을 형식화합니다. 그 구현에서 나는 포인터를 전달하지만 다른 사람들은 버퍼가 정적 인 것을 보았다. 가장 좋은 설명은 표준과 마찬가지로 여러 가지 itoa() 구현 중에서 선택할 수 있다는 것입니다. –

+0

@JulieinAustin - 나는 그들이 존재하지 않는다고 말하는 것이 아니라 단지 표준화되어 있지 않다는 것입니다. 귀하의 설명은 그 이유를 보여줍니다. 버퍼 크기는 기계의 레지스터 크기에 따라 다릅니다. C 표준위원회는 이와 같은 하드웨어 관련 세부 사항에서 벗어납니다. 표준화 된 함수는 일관된 인터페이스를 가져야하고 ** ** 모든 플랫폼에서 동일하게 작동해야하며이를 수행하는 유일한 실제 방법은'printf()'의 대부분을 재 작성하는 것입니다. – bta

+0

나는이 함수가 모든 종류의 일을 할 것이라고 주장했다. 실제로는 그렇지 않으며 적절한 크기의 족제비 단어를 사용하여 구현이 쉽게 지정되어 단어 크기 차이를 해결할 수 있습니다. 즉, 임의의 주어진 단어 크기에 대해, 그 단어 크기에 대해 모든 가능한 정수 값을 나타 내기 위해 필요한 기억 문자의 잘 알려진 유한 문자 수가 있습니다. TL; DR - 제안 할 수있는 것보다 훨씬 쉽고 일관되게 구현할 수 있습니다. –

1

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

는 다음과 같은 형태로 존재하고있다.

가 C 구현 역사적 상이한 정의 밑에 제공하고뿐만 아니라 C 프로그램 또한 가능한 충돌의 또 다른 원천이다 스스로 itoa 함수라는 기능을 제공한다.

기본적으로 itoa 식별자는 외부 이름 또는 매크로로 표준화와 관련하여 "방사성"입니다. 이러한 기능이 표준화 된 경우 다른 이름을 사용해야합니다.

관련 문제