Как работает этот пример?(Книжный пример функции get) - PullRequest
0 голосов
/ 25 мая 2018

В частности, в цикле while

  1. Какая переменная подает эту функцию getchar ()? Если это 's', где она выражена?

  2. Хорошая ли эта функция?Я вижу проблемы с различными функциями «чтения», такими как gets (), fgets () или scanf ().Может ли это создать проблемы, как у других?

    char * mygets(char *s) {
      int i = 0, ch;
      while ((ch = getchar()) != '\n')
        s[i++] = ch;
      s[i] = '\0';
      return s;
    }
    
    main() {
      char input[21];
      printf("type anything:\n");
      mygets(input);
      printf("output: %s\n", input);
    }
    

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Когда вы используете функции getchar (3) или gets (3), вход считывается со стандартного ввода процесса.

Функция getchar () эквивалентна getc (stdin).

Поскольку программа читает читает по одному символу за раз, вам нужно будет считать прочитанные символы и убедиться, что вы не «выходите за пределы доступного пространства».Это означает, что вам нужно передать «размер» s.

char*
mygets(char *s) {
    //is s a valid pointer to memory?
    //how much space is available in s?
    int i = 0, ch;
    //what is the maximum value of an int?
    //what happens when i++ exceeds MAX_INT?
    //does -1 make sense?
    //getchar(3) can return EOF
    while ((ch = getchar()) != '\n')
        s[i++] = ch;
    s[i] = '\0';
    return s;
}

Попробуйте вместо этого что-то подобное.Считайте прочитанные символы, убедитесь, что вы не запускаете конец переданного буфера, и

char*
mygets(char* s, const size_t size) {
    if( !s ) return s; //error, null pointer passed
    size_t count=0;
    char* sp = s;
    int ch;
    for( ; (count<size) && ((ch = getchar()) != EOF); ) {
        ++count; //count each character read, but not EOF
        if( (*sp++ = ch) == '\n' ) break; //store characters read, check for newline
    }
    *sp = '\0'; //null terminate s
    return s;
}

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

char buffer[999];
mygets(buffer, 999); //or mygets(buffer, sizeof(buffer));
0 голосов
/ 25 мая 2018

1) getchar () получает один символ по мере ввода .... поэтому он "ждет", пока вы наберете ... один символ на клавиатуре ..

2) Это основнойфункция, есть намного более оптимальные и продвинутые функции для выполнения этих вещей с символами ... но понимание того, что здесь происходит, ОЧЕНЬ важно, если вы хотите правильно кодировать ..

Cheers ...

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