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

getchar

28.11.2010, 18:47. Показов 7757. Ответов 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 / 3287 / 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 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.11.2010, 02:27
Цитата Сообщение от Lotles
что такое nsclen
это максимальная длина буфера new_str_cop, чтобы он не переполнился, нужно за этим следить

но тебе по ходу нужно продвигаться даже пока i < nsclen - 1, так как нуль-символ потом ещё пишешь
0
 Аватар для Kastaneda
5232 / 3206 / 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 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.11.2010, 09:58
https://www.cyberforum.ru/post1151124.html
getchar() нужно вынести из тела цикла, потому что он может не сработать и значит в строку записывать его результат не надо
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
29.11.2010, 10:23
accept, да действительно, если в потоке остается например '\n' после cin'а, то эти две записи (та, что была изначально и та, котороую предложили вы) ведут себя по разному. Но посути в таком случае не от той не от другой толку нет (строка не заполниться). Поэтому практичней самому следить за состоянием потока (например вставлять cin.ignore() там, где надо), после этого в ф-ции можно использовать любую запись цикла (как душе угодно))
0
4866 / 3287 / 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
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru