Getchar получает char только один раз - PullRequest
0 голосов
/ 05 января 2019

Даже если while истинно getchar повторяется один раз. Я попробовал свой код с getchar в while состоянии и теле, но он не работает.

int main() {
    char* s = malloc(sizeof(char)) /*= get_string("Write number: ")*/;
    char a[MAXN];
    int i = 0;
    do {
        a[i] = getchar();
        *s++ = a[i];
        i++;
    } while (isdigit(a[i-1]) && a[i-1] != EOF && a[i-1] != '\n' && i< MAXN);
    /*while (isdigit(*s++=getchar()))
        i++;*/
    *s = '\0';
    s -= i;
    long n = conversion(s);
    printf("\n%lu\n", n);
}

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Как уже отмечали другие, для s нет особого смысла, потому что a может быть передано conversion. И, опять же, malloc для s выделяет только один байт.

Вы увеличиваете i до выполнения циклических тестов, поэтому вы должны использовать i-1 там. Кроме того, цикл заканчивается i слишком большим.

Даже для вашего исходного кода выполнение int chr = getchar(); a[i] = chr; и замена a[i-1] на chr могут немного упростить ситуацию.

Еще лучше, реструктуризируя использование for вместо цикла do/while, мы можем добавить еще несколько комментариев для каждого управляющего условия, а не большее отдельное выражение условия.

#define MAXN        1000

int
main(void)
{
    char a[MAXN + 1];
    int i;

    for (i = 0;  i < MAXN;  ++i) {
        // get the next character
        int chr = getchar();

        // stop on EOF
        if (chr == EOF)
            break;

        // stop on newline
        if (chr == '\n')
            break;

        // stop on non-digit
        if (! isdigit(chr))
            break;

        // add digit to the output array
        a[i] = chr;
    }

    // add EOS terminator to string
    a[i] = 0;

    unsigned long n = conversion(a);
    printf("\n%lu\n",n);

    return 0;
}
0 голосов
/ 05 января 2019

Код не выделяет достаточно памяти с malloc(sizeof(char)), поскольку это только 1 байт.

Когда код пытается сохранить 2-е char в s, могут произойти плохие вещи: неопределенное поведение (UB).

В любом случае выделение не требуется.


Вместо этого сформируйте разумный буфер фиксированного размера и сохраните там символы / цифры.

// The max digits in a `long` is about log10(LONG_MAX) + a few
// The number of [bits in an `long`]/3 is about log10(INT_MAX)
#define LONG_DEC_SZ (CHAR_BIT*sizeof(long)/3 + 3)

int main(void)  {
  char a[LONG_DEC_SZ * 2]; // lets go for 2x to allow some leading zeros

  int i = 0;
  int ch; // `getchar()` typically returns 257 different values, use `int`

  // As long as there is room and code is reading digits ...
  while (i < sizeof a && isdigit((ch = getchar())) ) {
    a[i++] = ch;
  }
  a[i++] = '\0';
  long n = conversion(a);
  printf("\n%ld\n", n);
}

To Do: Этот код не допускает начальный знак, такой как '-' или '+'

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