Язык C getchar() и putchar()

Я новичок в изучении языка C, и у меня есть следующая проблема: я пытался распечатать имя, но оно не распечаталось. Вот что я пробовал:

#include <stdio.h>
#include <ctype.h>

int main()
{
    char name;
    int len = 0;

    printf("Enter the user name: ");
    name = getchar();

    while (name != '\n')
    {
        len++;
        name = getchar();
    }

    printf("char = %d\n", len);
    printf("name = ");
    putchar(name);

    return (0); 
}

выход:

Enter the user name: abcd
len = 4
name = 

он должен распечатать name = abcd.

Я ценю это и благодарю вас!


person Sang Dang    schedule 07.09.2017    source источник
comment
char name; : name может содержать только один символ.   -  person BLUEPIXY    schedule 07.09.2017
comment
так что мне теперь делать? пожалуйста @BLUEPIXY   -  person Sang Dang    schedule 07.09.2017
comment
Подготовьте массив как место для сохранения ввода. пример кода   -  person BLUEPIXY    schedule 07.09.2017
comment
Вы буквально выводите '\n'.   -  person Robert Columbia    schedule 07.09.2017
comment
Не по теме, так как запрос на исправление моего кода. Прочтите хорошую книгу по C и несколько справочников по C.   -  person Basile Starynkevitch    schedule 07.09.2017
comment
@BasileStarynkevitch извините, но просто скажите мне, что мне делать вместо того, чтобы исправлять мой код!   -  person Sang Dang    schedule 07.09.2017
comment
Вам потребуется несколько недель, чтобы изучить программирование на C. Так что возьмите хорошую книгу (или несколько) и прочитайте ее. Вам не хватает базовых знаний о программировании. Возможно, чтение SICP — отличное введение в программирование (которое не использует C) тоже должно быть полезно   -  person Basile Starynkevitch    schedule 07.09.2017
comment
Обратите внимание, что значение, возвращаемое getchar(), является int, а не char, потому что оно должно иметь возможность возвращать любой символ и отличное значение EOF. Вы также должны обрабатывать EOF в своем цикле ввода, в идеале (потому что, если ваш существующий код сталкивается с EOF, программы продолжают работать долгое, долгое, долгое время).   -  person Jonathan Leffler    schedule 07.09.2017


Ответы (5)


getchar() и putchar() могут одновременно обрабатывать только один символ. Поскольку вам нужно хранить строку, которая в основном представляет собой последовательность символов, вам нужно объявить name как массив символов.

Вы не можете использовать putchar() для печати строки. Попробуйте puts() или printf().

И добавьте символ \0, чтобы обозначить конец строки, когда вы встретите '\n', и в этот момент вы перестанете читать.

char name[20];
int len = 0;

printf("Enter the user name: ");
name[len] = getchar();

while (name[len] != '\n')
{
    name[++len] = getchar();
}
name[++len]='\0';

Если для печати строки необходимо использовать putchar(), у вас есть длина строки в len. Создайте цикл с переменной i=0 и продолжайте итерацию до тех пор, пока не будет i<len, увеличивая i на 1.

for(i=0; i<len; ++i)
{
    putchar(name[i]);
}


Возможно, вы захотите выполнить некоторую проверку ошибок, чтобы убедиться, что getchar() работает правильно. В случае ошибки он вернет EOF.
И name должно быть достаточно большим, чтобы вместить входную строку.

person J...S    schedule 07.09.2017

getchar() и putchar() обрабатывают только один символ.

получитьчар()-

является входной функцией. Он используется для чтения одного символа за раз из консольного ввода (обычно с клавиатуры).
Пример:

char c=getchar();

путчар()-

является выходной функцией. Он используется для отображения одного символа за раз на вывод консоли (обычно на монитор). Он принимает один аргумент символьного типа.
Пример:

char c;
putchar(c);

вы должны использовать gets() и puts() для работы со строками или вы можете использовать printf() и scanf()

person Sushant Verma    schedule 07.09.2017
comment
gets устарела уже более 10 (или 20) лет. - person Jabberwocky; 07.09.2017

Сначала узнайте о концепции массива в C.

Используйте scanf() и printf(), как показано ниже:

#include <stdio.h>

int main(){
    char name[20];
    printf("Enter the name: ");
    scanf("%s", name);

    printf("Name: %s", name);
    return 0;
}
person Dipesh Dulal    schedule 07.09.2017
comment
Нет, следует использовать fgets, а не scanf - person Basile Starynkevitch; 07.09.2017
comment
да, но проблема говорит, что я должен использовать getchar() и putchar() для чтения ввода. Извиняюсь!! - person Sang Dang; 07.09.2017
comment
scanf("%s", name) вместо scanf("%s", &name) - person J...S; 07.09.2017
comment
извините, но мне нужно использовать getchar() и putchar() вместо scanf @J...S - person Sang Dang; 07.09.2017

Вот как вы можете принимать ввод и печатать с помощью getchar() и putchar().

#include <stdio.h>
int main(void)
{   
int name;
printf("Enter the user name: ");
    while ((name = getchar()) != EOF)
         putchar(name);
    return 0;
    }

Надеюсь, это поможет. :)

person Kashif Faraz Shamsi    schedule 07.09.2017

Возможно, вам потребуется больше узнать о программировании и структурах данных. Я бы порекомендовал SICP, отличное бесплатное введение в программирование (которое не< /эм>о С).

Вам нужно больше узнать о C. В частности, о массивах (но у них есть ограничения, я предоставлю вам выяснить, какие из них), возможно, struct, указатели, динамическое выделение памяти C. Это займет у вас несколько недель, и вам нужно прочитать несколько книг (а также некоторые справочные материалы, такие как здесь, возможно, загляните также в спецификацию C11, т.е. ">n1570).

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

Поскольку вам необходимо использовать только getchar и putchar, вам необходимо внимательно прочитать их спецификацию. Имейте в виду, что stdio часто выполняет буферизацию. Возможно, вам потребуется использовать fflush.

Затем вы можете прочитать имя в какой-либо структуре данных (я оставляю вас, чтобы выяснить, какие из них), и вы можете читать по одному символу за раз, используя getchar для заполнения этой структуры данных. Точно так же вы можете выводить эту структуру данных по одному символу за раз, используя putchar.

Конечно, вы будете использовать некоторые примитивы управления потоком (вероятно, своего рода цикл).

Мы не будем делать вашу домашнюю работу.

Не забудьте включить все предупреждения и информацию об отладке в вашем компиляторе (например, компилируйте с помощью gcc -Wall -Wextra -g при использовании GCC). ...). Прочтите документацию по вашему компилятору (например, просмотрите Вызов GCC главу). Конечно, научитесь пользоваться отладчиком (gdb, см. Отладка с помощью ГБД)

Вы тот, кто начинает изучать программирование на C. Будьте настойчивы, это требует некоторого времени (недели или месяцы работы). Прочитайте несколько книг, изучите исходный код существующего программного обеспечения на C (например, бесплатное программное обеспечение на github).

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

person Basile Starynkevitch    schedule 07.09.2017