Как посимвольно считать строку в си
Перейти к содержимому

Как посимвольно считать строку в си

  • автор:

Считывание строки с клавиатуры посимвольно и последующий вывод

Author24 — интернет-сервис помощи студентам

Необходимо считать строку посимвольно, до тех пор пока не будет введен пробел. Проблема в том, что когда вывожу массив символов, который хранит строку выводятся символы «Н» в количестве на единицу больше, чем было введено в массив. Что в моем коде не так? В Си я совсем начинающий.

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
#include #include #include void main() { unsigned short int n = 0; //длина строки char *str; //строка char s; //текущий символ unsigned short int i; setlocale(LC_ALL, "RUS"); puts("Введите строку посимвольно. Пробел - конец ввода."); do { s = getchar(); if (s != 32) { n++; str = (char*)malloc(sizeof(char)*n); *(str+n-1) = s; } } while (s != 32); for (i = 0; i  n; i++) { putchar(*(str + i)); } getchar(); getchar(); }

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Вывод строки посимвольно
Ввести строку и вывести её посимвольно(каждый символ на новой строке). #include <string.h>.

Вывод в файл строки, считываемые с клавиатуры последовательно
Ниже приведён фрагмент кода. Который вывод в файл строки, считываемые с клавиатуры последовательно.

Ввод с клавиатуры бинарного дерева и последующий вывод
Добрый день. Необходимо составить программу, в которой будет производится ввод с клавиатуры.

Вывод строки посимвольно
Привет! Пытаюсь вывести строку посимвольно но не получается Компилятор TASM .MODEL small .STACK.

Как посимвольно считать строку в java

Для того, чтобы считать строку посимвольно в Java , можно использовать метод toCharArray() класса String , который возвращает массив символов, представляющих строку. Затем можно перебирать элементы массива с помощью цикла for и обрабатывать их по мере необходимости.

Например, следующий код считывает строку с клавиатуры и выводит ее посимвольно в консоль:

import java.util.Scanner; public class Main  public static void main(String[] args)  Scanner scanner = new Scanner(System.in); System.out.print("Введите строку: "); String str = scanner.nextLine(); char[] charArray = str.toCharArray(); for (char c : charArray)  System.out.println(c); > scanner.close(); > > 
  • В этом примере сначала создается объект Scanner для считывания ввода с клавиатуры.
  • Затем пользователю предлагается ввести строку, которая сохраняется в переменной str .
  • С помощью метода toCharArray() создается массив символов charArray , который затем перебирается с помощью цикла for-each .
  • Как только все символы строки выведены, сканер закрывается с помощью метода close() .

Как циклом перебирать посимвольно string переменную c++?

В общем в string переменную записано предложение. Необходимо циклом (for) перебирать его посимвольно для сравнения. Как это сделать, желательно без char переменной?

  • Вопрос задан более трёх лет назад
  • 4486 просмотров

Комментировать
Решения вопроса 1
Владимир Мартьянов @vilgeforce
Раздолбай и программист
str[0] например вас не устраивает?
Ответ написан более трёх лет назад
Нравится 3 7 комментариев
m_shpakov @m_shpakov Автор вопроса
можно по подробнее что вы имеете в виду?
Владимир Мартьянов @vilgeforce
m_shpakov: Я имел в виду что так можно посимвольно читать std::string.
m_shpakov @m_shpakov Автор вопроса
Владимир Мартьянов: ааа, понял, спасибо)
Владимир Мартьянов @vilgeforce

m_shpakov: В следующий раз подумайте о том, что чтение документации точно полезнее и вероятно быстрее регистрации на сайте.

Денис Загаевский @zagayevskiy
Владимир Мартьянов: нет, зачем. Сейчас он ещё спросит, как цикл организовать >_
Владимир Мартьянов @vilgeforce
Denis Zagayevskiy: Уже жду, да. А потом про длину строки еще вопрос возникнет 😉

Nipheris

Станислав Макаров @Nipheris Куратор тега C++

m_shpakov только учтите, что это будет работать только с однобайтовыми кодировками. С UTF-8 нужно обращаться иначе.

Посимвольный ввод и вывод в языке Си. Понятие буфера

В заголовочном файле stdio.h содержится объявление не только функции printf , но и многих других, связанных с вводом-выводом. Среди них есть функции, которые обрабатывают по одному символу за вызов — putchar и getchar .

Функция putchar() обычно принимает в качестве аргумента символ, либо символьную переменную и в результате своей работы выводит соответствующий символ на экран. Однако этой функции можно передать любое целое число, но, понятное дело, символа на экране вы можете не получить, если числу не соответствует ни один символ по таблице ASCII. Например:

char ch = 'c'; putchar('a'); putchar(98); putchar('\n'); putchar(ch);
ab c

Функции putchar() и printf() в определенном смысле взаимозаменяемы, так как, используя ту или другую, можно получить один и тот же результат. Хотя программный код будет выглядеть по-разному:

char str[] = "Hello"; int i; // первое Hello printf("%s\n", str); // второе Hello for (i = 0; str[i] != '\0'; i++) putchar(str[i]); printf("\n");

В результате выполнения этого кода на экране будут напечатаны два слова «Hello», разделенные переходом на новую строку. С putchar() это выглядит несколько сложнее. Как мы знаем, любая строка оканчивается нулевым по таблице ASCII символом, в данном случае этот символ служит сигналом для прекращения вывода на экран. Но если бы понадобилось вывести на экран строку, разделяя ее символы каким-нибудь другим символом (например, тире), то и в случае с printf() было бы не так все просто:

#include int main() { char str[] = "Hello"; int i; for (i = 0; str[i] != '\0'; i++) printf("%c-", str[i]); printf("%c%c %c", '\b', '\0', '\n'); for (i = 0; str[i] != '\0'; i++) { putchar(str[i]); putchar('-'); } printf("%c%c %c", '\b', '\0', '\n'); }
H-e-l-l-o H-e-l-l-o

Поэтому выбор в пользу той или иной функции зависит от ситуации и ваших предпочтений.

В отличие от функции putchar() функция getchar() не имеет параметров. Когда getchar() выполняется, она считывает из потока ввода один символ и возвращает его в программу. Полученный таким образом символ может быть присвоен переменной, участвовать в выражениях или выводиться на экран с помощью функций вывода.

int a; a = getchar(); printf("%c ", a); putchar(a); putchar('\n');

Если при выполнении этого кода ввести символ, то после нажатия Enter вы увидите два таких же символа на экране:

u u u

Первый — результат выполнения функции printf() , второй — putchar() . Если вы перед нажатием Enter введете несколько символов, то прочитан будет только первый, остальные будут проигнорированы. Посмотрим на этот код:

char a, b, c; a = getchar(); putchar(a); b = getchar(); putchar(b); c = getchar(); putchar(c); printf("\n");

Как вы думает, как он будет выполняться? По идее после ввода символа, он должен сразу отображаться на экране функцией putchar() и запрашиваться следующий символ, потому что далее идет снова вызов getchar() . Если вы сначала введете первый символ и нажмете Enter , то символ отобразится на экране. Потом вы введете второй символ и после Enter он тоже отобразится. И тут программа завершится, не дав ввести вам третий символ.

Прежде чем попытаться найти объяснение, изобразим «некорректного пользователя» и перед первым нажатием Enter введем несколько символов (больше двух). После Enter вы увидите три первых символа введенной вами строки, и программа завершится. Хотя куда логичней было бы ожидать, что будет прочитан только первый символ, потом выведен на экран и потом запрошен следующий символ.

Такое странное на первый взгляд поведение программы связано не с языком C , а с особенностью работы операционных систем, в которых реализован буферный ввод-вывод. При операциях ввода-вывода выделяется область временной памяти (буфер), куда и помещаются поступающие символы. Как только поступает специальный сигнал (например, переход на новую строку при нажатии Enter ), данные из буфера передаются по месту своего назначения (на экран, в переменную и др.).

Теперь, зная это, давайте посмотрим, что происходило в нашей программе, и сначала разберем второй случай с «некорректным пользователем», т.к. для понимания этот случай проще. Когда пользователь ввел первый символ, он попал в переменную a , далее сработала функция putchar(a) и символ попал в буфер. Так как Enter не был нажат, содержимое буфера на экране не отобразилось. Пользователь ввел второй символ, переменная b получила свое значение, а putchar(b) отправила это значение в буфер. Аналогично с третьим символом. Как только пользователь нажал Enter , содержимое буфера было выведено на экран. Но символы, которые были выведены на экран, были выведены не программой, а операционной системой. Программа же выводила символы еще до того, как мы нажали Enter .

Почему же в первом случае при выполнении программы мы смогли ввести и увидеть на экране только два символа? Когда был введен первый символ, то он был присвоен переменной a и далее выведен в буфер. Затем был нажат Enter . Это сигнал для выброса данных их буфера, но это еще и символ перехода на новую строку. Этот символ ‘\n’ , наверное, и был благополучно записан в переменную b . Тогда в буфере должен оказаться переход на новую строку, после этого введенный символ (уже помещенный в переменную c ). После нажатия Enter мы должны были бы увидеть переход на новую строку от символа b = ‘\n’ и букву. Однако печатается только буква. Причина этого вероятно в том, что переход на новую строку не хранится в буфере.

Во многих учебниках по языку C приводится пример считывания символов, вводимых пользователем, и их вывод на экран:

int a; a = getchar(); while (a != '\n') { putchar(a); a = getchar(); } putchar('\n');

В переменной a всегда хранится последний введенный символ, но перед тем как присвоить ей новое значение, с помощью функции putchar() старое сбрасывается в буфер. Как только поступает символ новой строки, работа цикла прекращается, а также, поскольку была нажата клавиша Enter , происходит вывод содержимого буфер на экран. Если в условии цикла while будет не символ ‘\n’, а какой-нибудь другой, то программа продолжит обрабатывать символы, даже после нажатия Enter . В результате чего мы можем вводить и выводить множество строк текста.

При совместном использовании функций putchar() и getchar() обычно пользуются более коротким способом записи. Например:

while ((a = getchar()) != '~') putchar(a);

Здесь в условии цикла сначала вызывается функция getchar() . Возвращенное ей значение присваивается переменной a . После этого значение a проверяется на неравенство символу тильды.

EOF

Как быть, если требуется «прочитать» с клавиатуры или файла неизвестный текст, в котором может быть абсолютно любой символ? Как сообщить программе, что ввод окончен, и при этом не использовать ни один из возможных символов?

В операционных системах и языках программирования вводят специальное значение, которое служит признаком окончания потока ввода или признаком конца файла. Называется это значение EOF (end of file), а его конкретное значение может быть разным, но чаще всего это число -1. EOF представляет собой константу, в программном коде обычно используется именно имя (идентификатор) константы, а не число -1. EOF определена в файле stdio.h .

#include int main() { int a; while ((a = getchar()) != EOF) { putchar(a); } putchar('\n'); }

В операционных системах GNU/Linux можно передать функции getchar() значение EOF , если нажать комбинацию клавиш Ctrl + D , в Windows – Ctrl + Z .

Решение задач

Не смотря на свою кажущуюся примитивность, функции getchar() и putchar() часто используются, т.к. посимвольный анализ данных при вводе-выводе не такая уж редкая задача. Используя только функцию getchar() , можно получить массив символов (строку) и при этом отсеять ненужные символы. Вот пример помещения в строку только цифр из потока ввода, в котором может быть набран абсолютно любой символ:

#include #define N 100 int main () { char ch; char nums[N]; int i; i = 0; while ((ch = getchar()) != EOF && i  N-1) if (ch >= 48 && ch  57) { nums[i] = ch; i++; } nums[i] = '\0'; printf("%s\n", nums); }

Напишите программу, которая считает количество введенных пользователем символов, строк и слов.

Курс с решением задач:
pdf-версия

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *