Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
 Аватар для Lotles
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167

getchar

28.11.2010, 18:47. Показов 7535. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не пойму почему getchar 2-ой раз запрашивает ввести строку, я же написал в цикле условие, что выполняется, если ch!=10
C++
1
2
3
4
    char ch=0;
    for (int i=0;ch!=10;i++){
        char ch=getchar();
        new_str_cop[i]=ch;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "stdafx.h"
#include <conio.h>
using namespace std;
char* new_str_cop=new char[50];
void copy(){
    char ch=0;
    for (int i=0;ch!=10;i++){
        char ch=getchar();
        new_str_cop[i]=ch;
    }
    new_str_cop[i]='\0';
}
void editing(){
    int j=0;
    char* new_str_ed=new char[50];
    for(int i=0;i<strlen(new_str_cop);i++){
        if (new_str_cop[i]==9){
            new_str_ed[j]='T';
            j++;
        }
        if (new_str_cop[i]==8){
            new_str_ed[j]='B';
            j++;
        }
        else
            new_str_ed[j]=new_str_cop[i];
        j++;
    }
        cout << new_str_ed << endl;
    }
 
 
 
    void main(){
        __asm int 3;
        copy();
        editing();
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2010, 18:47
Ответы с готовыми решениями:

getchar ()
a = getchar (); if ( a == 'q' ) // действие 1 a = getchar (); if ( a == 'w' ) // действие 2 Почему не работает такая...

Getline, getchar
Подскажите пожалуйста, как я поняла getline это шаблон функции, который построчно извлекает строки из выходного потока, но что делается...

Функция getchar() в С++
#include &lt;iostream&gt; // для оператора cout #include &lt;cctype&gt; // для функции islower #include &lt;cmath&gt; //для математич. вычислений ...

38
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
28.11.2010, 23:55
Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
    int ch;
 
    for (int i = 0; i < nsclen && (ch = getchar()) != '\n' && ch != EOF; i++)
        new_str_cop[i] = ch;
если ты в теле ставишь getchar(), то он может прочитать '\n' или вообще не прочитать ничего EOF, а потом записывает это в массив
int делается, чтобы программа не путала символ 0xFF и константу EOF
0
 Аватар для Lotles
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
29.11.2010, 00:32  [ТС]
getchar() как бэ символ просит ввести, а не строку.
getch() просит ввести символ, а getchar()-строку, ну можно и символ ввести

Добавлено через 17 минут
accept
что такое nsclen
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2010, 00:38
Lotles, getchar
0
 Аватар для Lotles
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
29.11.2010, 00:41  [ТС]
Я и так знаю(потому что я проверял) с помощью getchar() можно ввести строку но считывает и возвращает он 1 символ и читает он пока не найдет символ 10 включительно
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2010, 00:43
Lotles, Угу. Буферизованный ввод это называется.
Ввод идет до тех пор пока не будет получен символ перевода на новую строку - дальше из буфера береться по одному символу.
0
 Аватар для Lotles
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
29.11.2010, 00:52  [ТС]
for (int i = 0; i < nsclen && (ch = getchar()) != '\n' && ch != EOF; i++)
Что такое nsclen у меня это вообще не робит

Или скажите в чем ошибка(в главном коде)
Lotles, Угу. Буферизованный ввод это называется.
Ввод идет до тех пор пока не будет получен символ перевода на новую строку - дальше из буфера береться по одному символу.
почему символ перевода на новую строку, я проводил эксперимент это был символ конца строки-10
0
 Аватар для Vorox
26 / 25 / 10
Регистрация: 26.11.2010
Сообщений: 57
29.11.2010, 00:53
Цитата Сообщение от Lotles Посмотреть сообщение
C++
1
2
3
4
5
6
char ch=0;
 for (int i=0;ch!=10;i++)
{ 
char ch=getchar();
 new_str_cop[i]=ch;
 }
Думаю переобъявление ch в четвертой строчке явно лишнее
2
 Аватар для Lotles
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
29.11.2010, 01:00  [ТС]
Блин какая глупая ошибка
Молодец !
Ошибки нет, а почему getchar() просил ввести символ я так и не понял
ну хотя догадываюсь
C++
1
2
char ch=0;
 for (int i=0;ch!=10;i++)
Идет проверка этого ch те ch=0
А чо это 2 разных переменныъ в памяти размещ-ся с одним именем
Так ?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2010, 01:11
Lotles, Локальная переменная цикла перекрывала локальную переменную функции.
Т.е.

C++
1
2
3
4
5
6
char ch=0;//Локальная переменная функции
 for (int i=0;ch!=10;i++)//Сравнивается локальная переменная функции
{ 
char ch=getchar();//Перекрываем локальную переменную функции. + каждый раз определяем эту переменную снова
 new_str_cop[i]=ch;
 }
В итоге ch который сравнивается в цикле так и оставался нулем.
0
 Аватар для Vorox
26 / 25 / 10
Регистрация: 26.11.2010
Сообщений: 57
29.11.2010, 01:18
Цитата Сообщение от Lotles Посмотреть сообщение
почему getchar() просил ввести символ я так и не понял
1.Ты заходишь в цикл компилятор видит что ch обьявлена заранее (ошибки нет)
2. В цикле ты обьявляешь новый!!! ch. Затем выходим из цикла: происходит разрушение нового!!! ch
3.Заходим опять в цикл и проверяем ch обьявленную заранее, т.е. =0, на предмет равенства(бесконечный цикл однако)
0
 Аватар для Lotles
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
29.11.2010, 01:46  [ТС]
Все таки до конца не понял
Объявили char ch;
потом
C++
1
    for (int i=0;ch!=10;i++){
тут идет проверка ch и компилятор ch принимает за 0

Далее:
C++
1
        char ch=getchar();
Потом опять проверка
C++
1
    for (int i=0;ch!=10;i++){
почему сейчас то компилятор ch считает 0(почему компилятор выбрал 0, а не 128, если бы мы ввели первый символ А)
0
 Аватар для Vorox
26 / 25 / 10
Регистрация: 26.11.2010
Сообщений: 57
29.11.2010, 01:51
Цитата Сообщение от Lotles Посмотреть сообщение
Потом опять проверка
C++
1
for (int i=0;ch!=10;i++)
{
Не проверка а новый заход в цикл. Всех обьявленных переменных в цикле пока не существуют(их нет)
Вот и компилятор берет ch который был обьявлен до цикла.
ИМХО, такие вещи лучше делать через do while
0
 Аватар для Lotles
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
29.11.2010, 02:19  [ТС]
А как вобще такое возможно 2 переменных и 2 одинаковых имени
Вот здесь например нельзя 2 одинаковых переменных объявить
C++
1
2
3
4
5
6
7
8
#include "stdafx.h"
#include <conio.h>
using namespace std;
int main(){
    for(int i=0;i<10;i++){
        ;
        int i=30;
}
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2010, 02:23
Lotles, Области видимости. Это все области видимости...

Добавлено через 1 минуту
Мое же объяснение из одной из соседних тем...

1. Глобальная область видимости.

Обратится можно в любом месте программы, кроме тех случаев, когда локальная переменная с тем же именем перекрывает глобальную.

Пример.

C++
1
2
3
4
5
6
7
8
 int var=10;
int main()
{
    int x=var;//x=10
    int var=5;//Перекрыли глобальную переменную
    int y=var;//y=5
    int c=::var;//Явно указали что используем глобальную область видимости. c=10
}
2. Область видимости в блоке.

Локальная переменная - переменная, объявленная в каком-то блоке.

Пример.


C++
1
2
3
4
void foo()
{
    int a=10;//Локальная переменная. Видима только в этой функции
}
Код C++
C++
1
2
3
4
 for(int i=0; ;) //i - локальная переменная
{
    //Можем использовать i
}//Выход из области видимости. i уничтожается.
C++
1
2
3
4
5
6
7
8
9
 int main()
{
    int x=0;//Локальная переменная
    {
        int c=0;//Локальная переменная в блоке
    }//Выходим из области видимости блока. c уничтожается
    int t=c;//Ошибка. Не объявлен идентификатор c.
    return 0;
}//x уничтожается
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.11.2010, 02:27
Цитата Сообщение от Lotles
что такое nsclen
это максимальная длина буфера new_str_cop, чтобы он не переполнился, нужно за этим следить

но тебе по ходу нужно продвигаться даже пока i < nsclen - 1, так как нуль-символ потом ещё пишешь
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
29.11.2010, 09:40
Цитата Сообщение от Lotles Посмотреть сообщение
'\n' и 10 это одно и тоже
Так вы пробовали это или нет, т.к. в сишной реализации это не совсем одно и тоже. 0xA - это переход на новую строку, а '\n' это переход на новую строку и возврат каретки (т.е. нажатие "enter").

Добавлено через 1 минуту
блин, страницу не обновил, не увидел сколько понаписали.

Добавлено через 12 минут
Цитата Сообщение от Vorox Посмотреть сообщение
Вот и компилятор берет ch который был обьявлен до цикла.
Так та самая ch теперь имеет другое значение, так что все правильно.
Только что сам проверил, все правильно работает как с ch!=10 , так и с ch!='\n'.

Добавлено через 44 секунды
C++
1
2
3
4
5
6
7
8
9
10
void copy(){
        char ch=0;
        int i;
        for (i=0;ch!='\n';i++){
                ch=getchar();
                new_str_cop[i]=ch;
        }
        new_str_cop[i]='\0';
        cout<<"String : "<<new_str_cop<<endl;
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.11.2010, 09:58
https://www.cyberforum.ru/post1151124.html
getchar() нужно вынести из тела цикла, потому что он может не сработать и значит в строку записывать его результат не надо
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
29.11.2010, 10:23
accept, да действительно, если в потоке остается например '\n' после cin'а, то эти две записи (та, что была изначально и та, котороую предложили вы) ведут себя по разному. Но посути в таком случае не от той не от другой толку нет (строка не заполниться). Поэтому практичней самому следить за состоянием потока (например вставлять cin.ignore() там, где надо), после этого в ф-ции можно использовать любую запись цикла (как душе угодно))
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.11.2010, 10:38
Цитата Сообщение от Kastaneda
Но посути в таком случае не от той не от другой толку нет (строка не заполниться).
та запись, в которой getchar() вынесен из тела цикла, не будет записывать '\n' в буфер, если он встретится, а сразу закончит цикл, как и в случае, если данные в stdin закончились (потому что в stdin'e может и не быть '\n')
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2010, 10:38
Помогаю со студенческими работами здесь

[C++] аналог getchar()
привет ВСЕМ, ЗАДАЧА: Найти периметр и площадь равнобедренной трапеции с основаниями a и b (a &gt; b) и углом alpha при большем...

Функция getchar!
Здравствуйте, поясните на пальцах, что делает данная программа? #include &lt;stdio.h&gt; int main(void) { char ch; ...

getchar() в linux
Здравствуйте! Я создал небольшую консольную программу. Сначала мне нужно ввести данные с помощью cin и нажать Enter. Сразу после cin у меня...

функции getchar() и putchar()
Здравствуйте всем. Такая вот задачка: Есть вот такой код: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; ...

как работает getchar() ?
int c; c=getchar(); cout &lt;&lt; c; Набираю на клаве число 123 Cout выдает число 49 ??? Добавлено через 1 минуту из-за нажатия...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru