Форум программистов, компьютерный форум CyberForum.ru

getchar - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.79
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
28.11.2010, 18:47     getchar #1
Не пойму почему 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();
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2010, 18:47     getchar
Посмотрите здесь:

C++ getchar ()
[C++] аналог getchar() C++
C++ Getchar и putchar EOF
C++ Функция getchar!
Массив: функции getchar и putchar C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.11.2010, 23:55     getchar #21
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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
29.11.2010, 00:32  [ТС]     getchar #22
getchar() как бэ символ просит ввести, а не строку.
getch() просит ввести символ, а getchar()-строку, ну можно и символ ввести

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

Или скажите в чем ошибка(в главном коде)
Lotles, Угу. Буферизованный ввод это называется.
Ввод идет до тех пор пока не будет получен символ перевода на новую строку - дальше из буфера береться по одному символу.
почему символ перевода на новую строку, я проводил эксперимент это был символ конца строки-10
Vorox
 Аватар для Vorox
25 / 24 / 3
Регистрация: 26.11.2010
Сообщений: 57
29.11.2010, 00:53     getchar #27
Цитата Сообщение от 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 в четвертой строчке явно лишнее
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
29.11.2010, 01:00  [ТС]     getchar #28
Блин какая глупая ошибка
Молодец !
Ошибки нет, а почему getchar() просил ввести символ я так и не понял
ну хотя догадываюсь
C++
1
2
char ch=0;
 for (int i=0;ch!=10;i++)
Идет проверка этого ch те ch=0
А чо это 2 разных переменныъ в памяти размещ-ся с одним именем
Так ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.11.2010, 01:11     getchar #29
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 который сравнивается в цикле так и оставался нулем.
Vorox
 Аватар для Vorox
25 / 24 / 3
Регистрация: 26.11.2010
Сообщений: 57
29.11.2010, 01:18     getchar #30
Цитата Сообщение от Lotles Посмотреть сообщение
почему getchar() просил ввести символ я так и не понял
1.Ты заходишь в цикл компилятор видит что ch обьявлена заранее (ошибки нет)
2. В цикле ты обьявляешь новый!!! ch. Затем выходим из цикла: происходит разрушение нового!!! ch
3.Заходим опять в цикл и проверяем ch обьявленную заранее, т.е. =0, на предмет равенства(бесконечный цикл однако)
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
29.11.2010, 01:46  [ТС]     getchar #31
Все таки до конца не понял
Объявили 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, если бы мы ввели первый символ А)
Vorox
 Аватар для Vorox
25 / 24 / 3
Регистрация: 26.11.2010
Сообщений: 57
29.11.2010, 01:51     getchar #32
Цитата Сообщение от Lotles Посмотреть сообщение
Потом опять проверка
C++
1
for (int i=0;ch!=10;i++)
{
Не проверка а новый заход в цикл. Всех обьявленных переменных в цикле пока не существуют(их нет)
Вот и компилятор берет ch который был обьявлен до цикла.
ИМХО, такие вещи лучше делать через do while
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
29.11.2010, 02:19  [ТС]     getchar #33
А как вобще такое возможно 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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.11.2010, 02:23     getchar #34
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 уничтожается
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.11.2010, 02:27     getchar #35
Цитата Сообщение от Lotles
что такое nsclen
это максимальная длина буфера new_str_cop, чтобы он не переполнился, нужно за этим следить

но тебе по ходу нужно продвигаться даже пока i < nsclen - 1, так как нуль-символ потом ещё пишешь
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
29.11.2010, 09:40     getchar #36
Цитата Сообщение от 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;
}
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.11.2010, 09:58     getchar #37
getchar
getchar() нужно вынести из тела цикла, потому что он может не сработать и значит в строку записывать его результат не надо
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
29.11.2010, 10:23     getchar #38
accept, да действительно, если в потоке остается например '\n' после cin'а, то эти две записи (та, что была изначально и та, котороую предложили вы) ведут себя по разному. Но посути в таком случае не от той не от другой толку нет (строка не заполниться). Поэтому практичней самому следить за состоянием потока (например вставлять cin.ignore() там, где надо), после этого в ф-ции можно использовать любую запись цикла (как душе угодно))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2010, 10:38     getchar
Еще ссылки по теме:

getchar() в linux C++
функции getchar() и putchar() C++
как работает getchar() ? C++

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

Или воспользуйтесь поиском по форуму:
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.11.2010, 10:38     getchar #39
Цитата Сообщение от Kastaneda
Но посути в таком случае не от той не от другой толку нет (строка не заполниться).
та запись, в которой getchar() вынесен из тела цикла, не будет записывать '\n' в буфер, если он встретится, а сразу закончит цикл, как и в случае, если данные в stdin закончились (потому что в stdin'e может и не быть '\n')
Yandex
Объявления
29.11.2010, 10:38     getchar
Ответ Создать тему
Опции темы

Текущее время: 07:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru