2013-02-13 4 views
2

그래서 문자열을 콘솔에 출력하기 위해 write() 시스템 호출 (printf 및 다른 옵션을 사용할 수 없음)을 사용하는 함수를 만들려고합니다. 그러나, 나는 걸쇠를 쳤다. 여기 콘솔에 인쇄하기 위해 write() 사용하기

내 기능입니다 :에 의해 호출되는

static void doPrint (const char *s) 
{ 
    write (STDOUT_FILENO, s, sizeof(s)); 
} 

:

doPrint (에 "Hello World \ n!")

그러나, 그것은 단지 출력합니다 :

안녕하세요

우와 내가 잘못 뭐하는 거지?

참고 : STDLIB에 대한 액세스 및 표준 입출력은 당신이 원하는 것을하지 않습니다

감사 이러한 맥락 sizeof에서

+4

당신은 64 비트 컴파일러를 가지고있어서 운이 좋았습니다 ... 32 비트 컴파일러를 사용하면'sizeof'를 그렇게 사용하는 것입니다;) – hyde

답변

4

을 제한 - 그것은 포인터의 크기, 문자열이 아닌 크기를 산출한다. 대신 strlen을 사용하십시오.

하지만 다음 stdlib에 대한 액세스가

당신은 while와 카운터를 사용하여 자신의 롤 수 제한됩니다. 테스트되지 않은 :

size_t my_strlen(const char *s) 
{ 
    size_t len = 0; 
    while (*s++) 
     len++; 

    return len; 
} 

또는 약간 더 효율적인 버전 :

size_t my_strlen(const char* s) 
{ 
    const char *end = s; 
    while (*end++) {}; 
    return end-s-1; 
} 

포인터가 문자열의 마지막 위치로 전진하고 크기가 마지막 포인터 위치 사이의 차이가 있기 때문에 위의 작품 첫 번째 포인터 위치에서 널 종료 문자를 처리하는 과정을 빼고 1입니다.

+0

그래, 사용 하겠지만 stdlib가 제한됩니다. – Pat

+0

일 했으니, 고마워요! – Pat

+1

Nitpicking : 포인터 연산 'my_strlen'을 사용하면이 코드로보다 효율적입니다 :'const char * end = s; while (* end ++) {}; return end-s-1; – hyde

0

문제는 sizeof입니다. 크기를 명시 적으로 전달하거나 strlen을 사용해야합니다. 그것은 포인터의 크기를 취하고있다. strlen은 null로 끝나는 문자열에서만 작동합니다.

0

문제는 sizeof 포인터 변수는 포인터 변수의 길이입니다. strlen(s)에 포인터에 몇 개의 문자가 있는지 알아야합니다.

0

sizeof(s)을 원하지 않습니다. 인쇄 할 문자의 수는 문자열의 첫 번째 문자에 대한 포인터의 크기가 아니라 문자열의 길이입니다.

0

은 배열이 아니기 때문에 첫 번째 sizeof(char *) 바이트 만 인쇄합니다 (이 경우 8 일 것입니다 - 아마도 64 비트 시스템을 사용하고있는 것입니다).또한 this document을 읽어야

write (STDOUT_FILENO, s, strlen(s)); 

:

당신은 strlen()를 사용하여 문자열의 길이를 찾을 수있다.

0

write (STDOUT_FILENO, s, strlen(s)); 문자열이 null로 끝나는 것으로 가정합니다.

관련 문제