2014 dxdy logo

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

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




 
 Как этот код работает ?
Сообщение19.10.2021, 00:10 
Используется синтаксис 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 
В переменной c только один символ за раз. Целая строка проходится в цикле, по одному символу за итерацию.

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

 
 
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 00:34 
Аватара пользователя
Строка не хранится в int. В переменную c читаем по одному символу, приводим его к нижнему регистру и тут же печатаем.

 
 
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 00:52 
А что хранится в int с ?

-- 18.10.2021, 21:52 --

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

 
 
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 01:13 
Qlin в сообщении #1535406 писал(а):
Это же целочисленный тип.
Qlin, вы, судя по предыдущим темам, учили C++ (и вроде даже небезуспешно) в первой половине 2019 года. У вас случилась амнезия или приступ троллинга?

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

 
 
 
 Re: Как этот код работает ?
Сообщение19.10.2021, 02:21 
Видимо присваивание 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 
Аватара пользователя
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 
Qlin в сообщении #1535412 писал(а):
затем tolower( c ) обратно преобразует int в char
Читаем документацию tolower. Как аргумент, так и результат имеют тип int.

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

 
 
 
 Re: Как этот код работает ?
Сообщение29.10.2021, 00:53 
Аватара пользователя
Qlin в сообщении #1535406 писал(а):
А что хранится в int с ?

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


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

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

 
 
 
 Re: Как этот код работает ?
Сообщение29.10.2021, 00:57 
TheRuinedMap в сообщении #1536809 писал(а):
У вас это не вызывает вопросов?


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

 
 
 [ Сообщений: 13 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group