How do I get keyboard input for a const* char parameter?
I have an object that works with arrays of smaller objects. I am now creating a larger interface object that needs to collect input data and send it into a parameter of const* char . What code would I use to capture keyboard input of something like a 20 character title and be able to pass it into this parameter?
In Short:
How do you get keyboard input of a name and pass it into this:
I am restricted to using the iostream, iomanip, cstring, cctype libraries
EDIT: You asked for the whole code, so here it is. All my input is having problems.
4 Answers 4
But, be sure that you pass it a valid pointer to allocated memory! That is, use it like this:
and not like this:
EDIT. You have this code:
This is a bug. You create a pointer called aTitle , and do not initialize it. That pointer now points at memory you do not own.
The >> operator writes data to the location pointed to by your pointer. Since your pointer does not point at anything you control, the >> will invoke undefined behavior when its writes through your pointer.
Lesson: make sure that you provide valid values for all of your pointers. (Broader lesson: never use pointers. (Okay, almost never.))
Immediately following, you have this code:
But, consider the input state. Your user just typed «Jaws», followed by ENTER . Your cin>>aTitle read «Jaws», and left «\n» in the input stream.
This istream::getline call reads up to the first newline, which is the newline that follows «Jaws»(!) and not the newline that follows «Peter Benchley»! So now, you have «Jaws» in aTitle (assuming you fix your previous bug), nothing in aAuthor, and «Peter Benchley\n» still in the input stream.
Lesson: Don’t mix formatted input with getline . Use either one or the other consistently throughout your program.
Символы
Тип данных, используемый для записи символов называется char. Для считывания ввода/вывода символа используется спецификатор %c в командах scanf/printf. Пример ввода символа:
Под одну переменную типа char отводится в памяти место в 8 бит, это значит, что значение переменной может быть в пределах от -128 до 127. В переменной по факту хранится номер символа в таблице символов ASCII (таблицу можно посмотреть в интернете).
Часть таблицы ASCII:
Чтобы использовать номер символа, нужно написать этот символ в одинарных кавычках, например: ’$’. Это обозначение интерпретируется программой как номер символа $, то есть ‘$’ = 36.
Задача: вводится символ, если это заглавная английская буква C, то вывести yes, иначе no.
Решение: У нас есть два варианта как сравнить символы. Первый — это воспользоваться таблицей ASCII, в ней номер символа C равен 67. Второй — это воспользоваться одинарными ковычками: ‘C’. Естественно второй способ кажется нам проще(нам не нужно узнавать номер требуемого символа), но бывают задачи, в которых нужно воспользоваться данной таблицей. Такая задача есть чуть ниже.
Второй способ:
Важно!
Так как в переменной хранится номер символа, то это значит, что к переменной применимы все операции сложения, умножения, разности и деления, как и для обычных чисел. Эти операции будут производиться для номеров символов.
Задача: вводится заглавная буква английского языка, нужно вывести ее же, но только строчную.
Решение: Давайте посмотрим на таблицу символов, мы видим, что заглавные и строчные буквы идут по порядку от ’A’(номер 65) до ’Z’(номер 90) и прописные тоже от ’a’(номер 97) до ’z’(номер 122). Поэтому, чтобы перейти от любой заглавной буквы к соответствующей ей строчной букве нужно прибавить к её номеру 32. Код на Си:
Строки
В языке Си нет отдельного типа строк. Поэтому для записи строк используют массив типа char, то есть каждый элемент массива это какой-нибудь символ. Количество элементов массива будет являться максимальным размером строки. Важно помнить, что даже пробел это отдельный символ и он будет записан в массив.
Давайте попробуем ввести строку. Можно воспользоваться привычной уже нам функцией ввода scanf() вместе со спецификатором %s:
Но, используя scanf(), ввод строки будет осуществляться только до пустого символа, которым может быть и пробел. Поэтому, чтобы ввести полностью строку(до символа перевода строки), используется функция gets():
Последним элементом строки являться нуль символ, он обозначается так: ‘\0’. Этот символ нужен, чтобы понимать, где закончилась строка, а также, чтобы правильно работали функции для работы со строками.
Вот так выглядит строка «string», записанная в массив array:
Функции putchar() и getchar()
Эти функции служат для ввода и вывода только одного символа.
getchar()
Функция getchar() служит для ввода одного символа и возвращает его. Пример ввода символа с помощью getchar():
Если достигнут конец файла, то getchar() возвращается EOF. Этот факт можно использовать для ввода строки. Например, вам нужно вывести только цифры из заданной строки. Часть кода на Си:
Важно!
Часто в задачах нам нужно ввести что-то через функцию ввода scanf(), а после нее вести строку. Но scanf() не считывает символ перевод строки ‘\n’, поэтому gets(), следуя за scanf(), считает пустую строку. Для решения этой проблемы нам как раз может пригодиться getchar(). Он и считает этот одиночный символ перевода строки ‘\n’. Задача: водится размер строки и сама строка, нужно вывести строку. Код на Си:
putchar()
Если нам нужно вывести символ, то мы можем использовать не printf(), а putchar(). Пример ввода с помощью getchar() и вывода с помощью putchar():
Основные функции для строк
Существуют разные функции для строк, полностью про все функции рассказано в разделе Основные библиотеки в Си. Ниже приведены часто используемые функции:
1) Длина строки. В переменную length будет записана длина строки S.
Символы и строки
Символьная константа — это один символ, заключенный в апострофы. Его типом является тип char . Объявить символ можно так:
Строковая константа — это последовательность символов, заключенная в кавычки. Объявляем ее так:
Вы можете задать вопрос:»Почему размер массива символов задан равным пяти, а букв в строке мы написали четыре?». Дело все в том, что строковая константа всегда имеет на 1 символ больше, чем используется при записи, она ВСЕГДА заканчивается символом конца строки ‘\0’ , или, как его еще называют, ноль символом. Он никак не отображается при выводе строки на экран или в файл.
Соглашение об указателях char*
Сообщество программистов C и C++ договорились считать тип char* формой строкового типа. Соглашение заключается в том, что строки заканчиваются символом ‘\0’, и только для таких строк можно использовать функции библиотеки <cstring>. Язык C++ частично поддерживает тип char*, устанавливая, что строковая константа заканчивается ноль символом.
Существует важное отличие char* от char[]. Если вы объявили, например, строку char str1[5]; , то в дальнейшем вы не сможете написать str1=»abcd»; , компилятор просто выдаст ошибку. Если же вы объявили строку char* str1; , то вы со спокойной совестью можете дальше написать str1=»The solar system»;. Причем размер массива символов во втором случае может быть любым, он определится автоматически.
Если вы все же хотите объявит строку первым способом, то нужно сразу ее заинициализировать:
Ввод строк с клавиатуры
Чтобы ввести строку с клавиатуры, использовать поток cin, который мы всегда используем для ввода чисел или символов, нельзя. Дело в том, что поток cin прекращает ввод строки после ввода пробела. К тому же cin может продолжать ввод элементов за пределами массива, если под строку отводится меньше места, чем вводится символов.
Вместо потока cin нужно использовать функцию getline . Она позволяет вводить заданное количество символов, включаю пробелы. Эта функция останавливает ввод, когда достигает числового предела или, когда читает символ новой строки (Enter).
Длина вводимой строки может быть меньше заданного количества символов. В общем виде обращение к функции записывается так: Рассмотрим пример:
Как ввести char c
#include <stdio.h>
void main()
<
char c;
clrscr();
for (c=’a’; c<= ‘z’; c++) printf(«%c»,c);
>
Эту же программу можно написать, используя в цикле не непосредственно символы, а их коды в шестнадцатеричной нотации:
for (c= 0x61; c<= 0x7A; c++) printf(«%c»,c);
Или используя десятичную запись кодов символов:
for (c= 97; c<= 122; c++) printf(«%c»,c);
Результат выполнения этих программ будет абсолютно одинаковым.
Для ввода символов с клавиатуры можно воспользоваться функцией getch, а для вывода символа на экран функцией putch. Напишем программу «калькулятор», где аргументы (числа) и символ операции будут вводиться последовательно:
#include <stdio.h>
void main()
<
float x,y,z;
char ch;
clrscr();
printf(«Vvedi X:»);
scanf(«%f»,&x); /* Ввод первого числа */
printf(«Vvedi znak:»);
ch = getch(); /* Ввод знака операции */
putch(ch); /* Вывод знака на экран */
printf(«\nVvedi Y:»);
scanf(«%f»,&y); /* Ввод второго числа */
/* Вычисляем результат в зависимости от знака операции*/
if (ch == ‘-‘) z = x-y;
if (ch == ‘+’) z = x+y;
if (ch == ‘*’) z = x*y;
if (ch == ‘/’) z = x/y;
printf(«Z=%f»,z);
>
#include <stdio.h>
void main()
<
char c[80]; /* Объявляем строку как массив из 80 символов */
clrscr();
puts(«Input string:»); /* Выводим сообщение на экран */
gets(c); /* Считываем строку с клавиатуры */
puts(c); /* Выводим полученную строку на экран */
>
#include <stdio.h>
#include <string.h>
void main()
<
char s1[80], s2[80];
int z;
clrscr();
puts(«Input string1:»);
gets(s1); /* вводим строку 1 */
puts(«Input string2:»);
gets(s2); /* вводим строку 2 */
z = strlen(s1); /* Вычисляем длину строки s1 */
printf(«Dlina S1=%d \n»,z);
strcat(s1,s2); /* Складываем две строки */
printf(«S1 + S2 =%s \n»,s1);
z = strlen(s1); /* Вычисляем длину результирующей строки */
printf(«Dlina S1=%d \n»,z);
>
Результат работы программы будет такой:
#include <stdio.h>
#include <string.h>
void main()
<
char s1[80];
int n,z,q;
clrscr();
puts(«Input string:»);
gets(s1); /* Вводим произвольную строку (не более 80 символов) */
printf(«S1=%s \n»,s1);
z = strlen(s1); /* Вычисляем длину введённой строки */
q = 0; /* Обнуляем счётчик символов «а» */
/* Создаём цикл для сканирования строки */
for (n=0; n<=z-1; n++)
<
if (s1[n] == ‘a’) q++; /* Если очередной символ равен «а», то увеличиваем счётчик на единицу */
>
printf(«Sibols a=%d»,q); /* Выводим число найденных символов «а» на экран */
>
Результат работы программы: