Проблема с вводом символов с помощью getchar () или getche () - PullRequest
2 голосов
/ 12 августа 2010

Когда я компилирую коды C (из Учите себя C, 2-е издание - Герберт Шильдт ), написанные ниже на Borland C ++ v5.02, я получаю предупреждающее сообщение, как показано ниже:, 6): конверсия может потерять значащие цифры "

Что не так?

#include "stdio.h"

main()
{
 char ch;
 ch = getchar();
 printf(" You typed: %c", ch);

 return 0;
}

Та же проблема с другим примером:

#include "conio.h"
#include "stdio.h"

main()
{
 char ch;

 printf("Enter a character: ");
 ch = getche();
 printf("\nIts ASCII code is %d", ch);

 return 0;
}

Ответы [ 3 ]

6 голосов
/ 12 августа 2010

getchar () возвращает int, чтобы он мог возвращать не символьные значения, такие как EOF.Поэтому, когда вы сохраняете возвращаемое значение в меньшем типе данных, например в char, вы потенциально теряете информацию.

Книги Шильдта обычно считаются худшими из доступных для изучения C (или C ++), и это хороший примерЗачем.Вам бы посоветовали приобрести лучшую книгу, например, K & R.

2 голосов
/ 12 августа 2010

Прототип для getchar:

int getchar (void);

Возвращает int, потому что нужно вернуть EOF, который не является символом.


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

Поскольку тип данных char может содержать только один из символов, невозможно будет указать этот конец файла, если вся возвращаемая функция была char.Это потому, что если вы выбрали одно из этих char значений для представления конца файла, вы не смогли бы определить разницу между концом файла и действительным символом.

Например, давайте выберем 'A ', чтобы указать конец файла.Когда вы на самом деле получаете «A» из getchar(), как вы узнаете, достиг ли вы конца файла или пользователь действительно ввел «A»?

Чтобы обойти это, многие функциикоторый возвращает вам char, фактически даст вам int и использует одно из целочисленных значений, которые не имеют фактического char эквивалента (например, -1).

В этом случае(при условии 8-битного char), вы получите либо -1, если вы достигли конца файла, либо значение от 0 до 255 включительно, представляющее введенный символ.


И вам нужно приобрести более современную книгу и более современный компилятор:

#include <stdio.h>
int main (void) {
    int ch = getchar();
    if (ch != EOF)
        printf("You typed: %c\n", ch);
    return 0;
}

Почему кто-то все еще использует Borland - это день и эпоха (где gcc является простокак дешево и намного лучше) выше меня.

0 голосов
/ 13 августа 2010

А как насчет этой альтернативной программы? Работает нормально.

#include <stdio.h>

main()
{
 char ch;

 getchar();

 printf("Enter the character: ");
 scanf("%c", &ch);
 printf(" You typed: %c\n", ch);
 return 0;
}

Пожалуйста, оставьте несколько комментариев.

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