2013-02-13 2 views
2

Так что я пытаюсь создать функцию, которая использует системный вызов write() (printf и другие параметры недоступны) для вывода строки на консоль. Однако я ударил.Использование write() для печати на консоль

Вот моя функция:

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

который вызывается по:

doPrint; ("Hello World! \ П")

Однако, только печатает:

Здравствуйте Wo

Что я делаю неправильно?

Примечание: доступ к STDLIB и STDIO ограничен

Благодаря

+4

Вам повезло иметь 64-битный компилятор ... С 32-битным компилятором было бы просто 'Hell' использовать' sizeof' таким образом;) – hyde

ответ

4

В этом контексте sizeof не делать то, что вы хотите - это дает размер указателя, а не размер строки. Вместо этого используйте 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: использование указателя arithmetic 'my_strlen' будет немного более эффективным с этим кодом:' const char * end = s; while (* end ++) {}; return end-s-1; ' – hyde

0

Проблема: ваш sizeof. Вы должны явно указать размер или использовать strlen. Он принимает размер указателя. strlen работает только с нулевыми символами.

0

Проблема: sizeof указатель переменной является длиной переменной указателя. Вы хотите, чтобы strlen(s) обнаружил, сколько символов указателя.

0

Вы не хотите sizeof(s). Количество символов, которые вы хотите распечатать, - это длина строки, а не размер указателя на первый символ в строке.

0

s - это указатель, а не массив, поэтому вы печатаете только первые байты sizeof(char *) (в данном случае это 8, возможно, вы используете 64-битную систему).

Вы должны найти длину строки, используя strlen():

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

Вы также должны прочитать this document.

0

write (STDOUT_FILENO, s, strlen(s)); Предполагая, что ваша строка завершена с нулевой отметкой.

Смежные вопросы