2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Как этот код работает ?
Сообщение19.10.2021, 00:10 


06/04/18

323
Используется синтаксис C++
#include <cstdio>
#include <ctype.h>

int main() {
    int c;
    while ( ( c = getchar() ) != EOF )
        putchar( tolower( c ) );
    return 0;
}

В процессе выполнения вводим 1aBc#, получаем 1abc#, и так далее.
Каким образом в переменной $c$ типа int складируется целая строка ?

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 00:15 


18/09/21
1682
В переменной c только один символ за раз. Целая строка проходится в цикле, по одному символу за итерацию.

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 00:27 


06/04/18

323
zykov в сообщении #1535402 писал(а):
Целая строка проходится в цикле
Каким образом она присваивается и хранится ? Тем более странно, что она хранится в переменной типа int. Разве тип int предназначен для хранения строк или чего-то подобного ?

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 00:34 
Заслуженный участник
Аватара пользователя


16/07/14
8444
Цюрих
Строка не хранится в int. В переменную c читаем по одному символу, приводим его к нижнему регистру и тут же печатаем.

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 00:52 


06/04/18

323
А что хранится в int с ?

-- 18.10.2021, 21:52 --

Это же целочисленный тип.

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 01:13 
Заслуженный участник


09/05/12
25179
Qlin в сообщении #1535406 писал(а):
Это же целочисленный тип.
Qlin, вы, судя по предыдущим темам, учили C++ (и вроде даже небезуспешно) в первой половине 2019 года. У вас случилась амнезия или приступ троллинга?

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 02:09 


18/09/21
1682
Смотрим документацию по getchar.
Она читает ровно ОДИН символ из стандартного входного потока.
Код этого символа записывается в переменную c.
Если это специальный код EOF, то происходит выход из цикла.
Если нет, то функция tolower возвращает код для буквы нижнего регистра, если был верхний регистр (или возращает без изменения, если это не была буква верхнего регистра).
Функция putchar посылает этот символ в стандартный выходной поток.
Потом следующая итерация цикла и т.д.

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 02:21 


06/04/18

323
Видимо присваивание c = getchar() преобразует полученный с клавиатуры char в int, затем tolower( c ) обратно преобразует int в char. При этом есть странность в поведении функции getchar(), которая, получив строку, выстраивает из неё очередь, и при каждом вызове посимвольно возвращает значения из очереди, не запрашивая ввода с клавиатуры. У меня этому нет другого объяснения
Используется синтаксис C++
#include <iostream>
using namespace std;

int main() {
    char cha = getchar();
    char chb = getchar();
    cout << cha << '\n';
    cout << chb;
}

При запуске программы один раз вводим AB, получаем:
A
B

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 02:37 
Заслуженный участник
Аватара пользователя


22/06/12
2129
/dev/zero
Qlin, вы серьёзно?

(man getchar)

Цитата:
NAME
fgetc, fgets, getc, getchar, ungetc - input of characters and strings

SYNOPSIS
#include <stdio.h>

int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);

char *fgets(char *restrict s, int size, FILE *restrict stream);

int ungetc(int c, FILE *stream);

DESCRIPTION
fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or
error.

getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once.

getchar() is equivalent to getc(stdin).

fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Read‐
ing stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('\0')
is stored after the last character in the buffer.

ungetc() pushes c back to stream, cast to unsigned char, where it is available for subsequent read operations. Pushed-back
characters will be returned in reverse order; only one pushback is guaranteed.

Calls to the functions described here can be mixed with each other and with calls to other input functions from the stdio
library for the same input stream.

For nonlocking counterparts, see unlocked_stdio(3).

RETURN VALUE
fgetc(), getc(), and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.

fgets() returns s on success, and NULL on error or when end of file occurs while no characters have been read.

ungetc() returns c on success, or EOF on error.


 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 03:24 


18/09/21
1682
Qlin в сообщении #1535412 писал(а):
затем tolower( c ) обратно преобразует int в char
Читаем документацию tolower. Как аргумент, так и результат имеют тип int.

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение23.10.2021, 12:21 
Заслуженный участник


12/08/10
1622
Qlin в сообщении #1535412 писал(а):
При этом есть странность в поведении функции getchar(), которая, получив строку, выстраивает из неё очередь, и при каждом вызове посимвольно возвращает значения из очереди, не запрашивая ввода с клавиатуры.
Именно так.

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение29.10.2021, 00:53 
Аватара пользователя


28/10/21
99
Qlin в сообщении #1535406 писал(а):
А что хранится в int с ?

Это же целочисленный тип.


Не совсем понимаю сути этого замечания в данном контексте. 'signed char' и 'unsigned char' - это тоже целочисленные типы.

У вас это не вызывает вопросов?

 Профиль  
                  
 
 Re: Как этот код работает ?
Сообщение29.10.2021, 00:57 


10/03/16
3995
Aeroport
TheRuinedMap в сообщении #1536809 писал(а):
У вас это не вызывает вопросов?


Вызывает )) Зачем было называть это "символом"? Как указание на диапазон -127 : 127 (signed) и 0:255 (unsigned)? Назвали бы тогда каким-нибудь "однобайтным целым"...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group