Использование sprintf для преобразования целого числа в строку, похоже, игнорирует 0 - PullRequest
0 голосов
/ 30 октября 2018

Когда я запускаю следующий код с вводом '01', значение имеет значение 1, игнорируя 0. Однако, если я ввожу '301' с 0 не в первой позиции, код работает.

int input;
printf("Enter an number: \n");
scanf(" %d", &input);

char array[10];
int value = sprintf(array, "%d", input);
printf("%d", value);

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Страница руководства sprintf() говорит

int sprintf(char *str, const char *format, ...);

sprintf(), запись в строку символов str.

Здесь

int value = sprintf(array, "%d", input);

sprintf() преобразует вход int в char array.

Например, если пользователь ввел input как целое число 123, он преобразует это в массив символов 123. Теперь это выглядит как

-------------------------
|  1  |  2  |  3  |  \0  |
-------------------------
array

и sprintf() возвращает возвращает количество напечатанных символов (исключая нулевой байт, используемый для завершения вывода в строки). Это означает

int value = sprintf(array, "%d", input); /* if input = 123(integer) */
printf("%s: ,%d: \n", array,value);/* array: 123(string), value: 3 */

Когда я запускаю следующий код с вводом '01', значение имеет значение 1, игнорируя 0.? input объявляется как целое число, и когда пользователь дает 01 тогда scanf() рассматривает только 1 как ведущий 0, игнорируемый и только 1 сохраняется в array, array выглядит как

--------------
|  1  |  \0  |
--------------
array

Однако, если я ввожу '301' с 0, а не в первой позиции, код работает. Если пользователь ввел 301, тогда scanf() сохраняется 301 в input и sprintf() преобразует int в массив символов и сохраняет в array как 301 как

     -------------------------
    |  3  |  0  |  1  |  \0  |
    -------------------------
    array
0 голосов
/ 30 октября 2018

Когда вы читаете строку как число с использованием спецификатора формата %d, все ведущие нули в основном теряются.

Если вы хотите сохранить начальные нули, вам нужно прочитать входные данные в виде строки. Таким образом, вы получите именно то, что введено пользователем. Если вы дополнительно хотите выполнить числовые операции, вы можете использовать strtol для получения числового представления.

char array[10];
scanf("%s", array);

int input = strtol(array, NULL, 10);
printf("input as number %d, input as string: %s\n", input, array);
0 голосов
/ 30 октября 2018

Способ распознавания начальных '0' цифр заключается в записи смещения сканирования ввода.

int n1, n2;
int input;
if (scanf(" %n%d%n", &n1, &input, &n2) == 1) {
  char array[40];
  int width = n2 - n1;
  int text_length = sprintf(array, "%0*d", width, input); // "0" --> Pad with zeros
                                                       // "*" --> Min width in argument list
  printf("%d <%s>\n", text_length, array);  
}

" " будет занимать ведущие пробелы. "%n" запишет позицию смещения сканированного текста. "%n" не влияет на возвращаемое значение scanf().

Ограничения: ввод, такой как "-123" и "+123", сообщит 4.

...