C вопрос о генераторе случайных чисел (книга по C 4-е издание) - PullRequest
1 голос
/ 23 марта 2020
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int i, n;

   printf("\n%s\n%s",
     "Some randomly distributed integers will be printed.",
     "How many do yo want to see? ";
   scanf("%d", &n);
   for (i = 0; i < n; ++i) {
     if (i % 10 == 0)
       putchar('\n');
     printf("%7d", rand());
   }
   printf("\n\n");
   return 0;
}

это код из учебника "Книга по C".

при вводе 23 при появлении запроса предполагается генерировать 23 случайных числа в 3 строках, 8 столбцах (3 * 8-1).

я узнал, что printf("%7d", rand()) должен возвращать значение, напечатанное в формате десятичного целого числа, а ширина поля, в котором печатается целое число, равна 7.

однако, я получаю случайные числа шириной более 7, и это не выглядит аккуратно. (без столбцов и строк, просто огромный массив последовательных чисел, таких как 1235289043528935294835698246182965982)

Я думал, что это как-то связано с функцией выражения printf("%7d", rand()) и с тем, как она должна возвращать значения.

Я начинаю думать, что учебник неправильный.

Ответы [ 4 ]

1 голос
/ 23 марта 2020

Ваши номера больше 7 цифр. Вы можете попробовать:

A) Изменение поля ширины выше:

printf("%14d", rand() );

или

B) Создание сгенерированные числа меньше 7 цифр:

printf("%7d", rand() % 1000 );

Более подробную информацию о спецификаторах формата можно найти здесь

Надеюсь, это поможет!

0 голосов
/ 23 марта 2020

Вместо того, чтобы угадать максимальную ширину числа rand(), вычислите ширину максимального случайного числа: RAND_MAX.

snprintf(NULL, 0, ... печатает количество символов, которые были бы записаны в буфере было достаточно большим, не считая завершающего нулевого символа.

int width = snprintf(NULL, 0, "%d", RAND_MAX);

Позже при печати используйте ширину.

printf(" %*d", width, rand());

как в

#define COLUMN_N 8
for (i = 0; i < n; ++i) {
  printf(" %*d", width, rand());
  if (i % COLUMN_N == COLUMN_N - 1 || i + 1 == n) {
    putchar('\n');
  }
}
0 голосов
/ 23 марта 2020

В дополнение к комментарию выше, если я правильно понимаю, вы хотите, чтобы все 8 чисел, то строка должна быть изменена на: if (i% 8 == 0);

0 голосов
/ 23 марта 2020

Вы не печатаете пробелы. Попробуйте вставить:

printf("%7d\t", rand());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...