Как реализовать функцию put ()? - PullRequest
1 голос
/ 14 июля 2010

Я попытался реализовать функцию put. Фактически он возвращает значение, но я не могу получить то, что оно должно возвращать. Пожалуйста, проверьте мой код и проведите меня дальше

Ответы [ 7 ]

4 голосов
/ 14 июля 2010

См. Комментарии в коде.

int puts(const char *string)
{
    int i = 0;
   while(string[i])  //standard c idiom for looping through a null-terminated string
    {
        if( putchar(string[i]) == EOF)  //if we got the EOF value from writing the char
        { 
            return EOF;
        }
        i++;
    }
   if(putchar('\n') == EOF)  //this will occur right after we quit due to the null terminated character.
   {
       return EOF;
   }
   return 1; //to meet spec.
}

И, кроме того, я написал эквивалент putc, который несколько раз описывает разработку во встроенных системах. Так что это не всегда просто учебное упражнение. :)

Комментарий к EOF: Это константа POSIX из stdio.h. В моем Linux stdio.h у меня есть это определение:

/* End of file character.
   Some things throughout the library rely on this being -1.  */
#ifndef EOF
# define EOF (-1)
#endif

Этот код определения - GPL 2.1.

0 голосов
/ 07 октября 2016

В системах без поддержки многопоточности (программирование с использованием чистого металла) putc обычно вообще ничего не возвращает.

В этих случаях не беспокойтесь о кодах возврата. Простейшая реализация приводит к реализации :

void puts (char *s)
{
    while (s && *s)
        putchar (*s++);
}   
0 голосов
/ 14 июля 2010

В дополнение к тому, что уже было сказано, я лично против переопределения стандартных библиотечных функций. Однако, если вам абсолютно необходимо (например, для домашнего задания), и ваш компилятор жалуется на конфликтующие типы для «пут», попробуйте поставить это вверху:

#define puts _puts
#include <conio.h>
#include <stdio.h>
#undef puts
0 голосов
/ 14 июля 2010

Не вижу смысла в реализации путов! в любом случае, вы должны прочитать спецификации путов, чтобы вы могли это сделать.

это может помочь

int myputs(char* s)
{
   int x = printf("%s\n", s);
   return (x > 0) ? x : EOF;
}

Вы должны включить stdio.h, чтобы вы могли использовать printf и EOF.

Обратите внимание, что это не ТОЧНАЯ реализация путов, потому что при ошибках пут устанавливает индикатор ошибки и выполняет другие действия.

Подробнее о путах, здесь .

0 голосов
/ 14 июля 2010

Ну, stdio's put () возвращает неотрицательное число в случае успеха или EOF в случае ошибки.

0 голосов
/ 14 июля 2010

Со страницы руководства:

#include <stdio.h>

int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
int puts(const char *s);

Возвращаемое значение

fputc(), putc() и putchar() возвращают символ, написанный как беззнаковый символприведите к int или EOF при ошибке.

puts() и fputs() вернут неотрицательное число при успехе или EOF при ошибке.

0 голосов
/ 14 июля 2010

Что string должно быть?Вы должны определить свою функцию лучше , попробуйте:

void my_puts(const char *string)

вместо

void puts(string)

Как указано в ссылке, которую я включил, вам необходимо указать тип данныхаргумента, который вы передаете (в вашем примере string), и вы не можете использовать имя функции, которая уже была определена (например, puts).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...