C/C++ - Помогите пожалуйста решить проблему со словами.

Аватара пользователя
LilLoco

Re: C/C++ - Помогите пожалуйста решить проблему со словами.

Сообщение LilLoco »

Ну За Путаницу Извините... Изображение Изображение Изображение Ну А Пример Уже Привел Drongo !!!
Аватара пользователя
dakishi

Re: C/C++ - Помогите пожалуйста решить проблему со словами.

Сообщение dakishi »

Цитата Drongo:



char *ch; // Можно ввести строку символов или один символ
C/C++ - Помогите пожалуйста решить проблему со словами.




Ну, я так понял, если использовать с *, я могу до нескольких символов вводить. Ну, я вроде все правильно понял. Ну, мне вообщем мне нужен такой код. Спасибо конечно большое, я многое понял, но просто здесь, почему то, ну не хочет он, хотя я думаю правильно написал. Кто либо, или вы, просто покажите код, в котором можно вводить слово, и это для меня более исправит сразу все ошибки и мне понятно будет. Только прокомментируйте, если не трудно, то, что новое, вы не говорили, а все остальное не надо. Мне просто намного легче разобраться, если это готовый код. А про массив, да я знаю, что это такое, это так же называется константой, я прав ? Но с константой я, сколько не пробовал - и так, и сяк, все равно пишет ту же самою ошибку. Не понимаю, почему нельзя было сделать не один символ для типа char, а например 260 хотя бы, чтоб никто не замудрялся - этого хватит думаю многим. А кому мало, какой нибуть - long char - и символов в несколько раз больше. Зачем ограничивать не понимаю. Если ради экономии размера, то тут он не очень большой вроде, да и могли бы создать одну для экономии, другую нет, как например дело с цифровыми типами. Вот то, чего я добиваюсь, но выдает ошибку:



Код: Выделить всё

#include <iostream>
using namespace std;
main()
{
   char*q1;
   cout << "Enter Char = ";
   cin >> q1;
   if (*q1 == 'water') {
      cout << "1";
     }
   else {
     cout << "2";
     };
   cin >> q1;
return 0;
}
Аватара пользователя
LilLoco

Re: C/C++ - Помогите пожалуйста решить проблему со словами.

Сообщение LilLoco »

Массив - это не константа! на сколько я помню с++ то размер массива можно задавать только при помощи констант! константы это те данные которые невозможно изменить ни в каком месте программы кроме как в объявлении! а массив это как бы набор данных одного и того же типа!





Код:

Код: Выделить всё

void main()
{
       char q1[100]     // Объявление переменной q1 длинной 100 символов
       cout << "Введите ..."
       cin >> q1;
       if (q1 == "water")
       {
                cout << "1";
       }
       else
       {
                 cout << "2";
        }
}

З.Ы. Извините за синтаксические ошибки Изображение
Аватара пользователя
Drongo

Re: C/C++ - Помогите пожалуйста решить проблему со словами.

Сообщение Drongo »

Цитата dakishi:



Не понимаю, почему нельзя было сделать не один символ для типа char, а например 260 хотя бы
C/C++ - Помогите пожалуйста решить проблему со словами.




Это вам надо посмотреть табличку кодов ANSII-символов, так сложилось что символы с кодом от 0 до 128 жёстко прописаны, это символы латиницы, верхнего\нижнего регистра, знаки препинания и т.д. А символы с кодом от 128 до 255 отданы под национальные стандарты. Char - это один символ. Нужна строка символов? Можно использоватль символьный указатель

Код:

Код: Выделить всё

char *name;

Или подключить библиотеку



Код:

Код: Выделить всё

#include 

и использовать тип переменной - string



Код:

Код: Выделить всё

string mystring;

Одинарные кавычки используются когда нужно проверить какой-то один символ

Код:

а парные, когда нужно проверить строку символов. Дело в том что символьная строка заканчивается нулевым символом '\0'. В общем я сам немного запутался...





Код:

Код: Выделить всё

#include 
using namespace std;
#include 
main()
{
   const int size = 510;  // размер символьного массива ввода
   char q1[size]; // Массив с размером в 510 символов
   char q2[] = "water"; // Проверяемое слово
   cout 
Аватара пользователя
El Scorpio

Re: C/C++ - Помогите пожалуйста решить проблему со словами.

Сообщение El Scorpio »

Цитата Drongo:



Можно использоватль символьный указатель

Код:

char *name;

Или подключить библиотеку

Код:

#include

и использовать тип переменной - string
C/C++ - Помогите пожалуйста решить проблему со словами.




Правильным способом будет использование объектов класса string

Символьные указатели - это настолько сложная в понимании и опасная в использовании тема, что новичкам её лучше не касаться.
Аватара пользователя
dakishi

Re: C/C++ - Помогите пожалуйста решить проблему со словами.

Сообщение dakishi »

Спасибо большое! Я все понял. Вы мне очень помогли. Ну, я пока что не дошел до массивов. Я дошел до темы "функции", в которой пока копаюсь, она очень длинная. Да, со string легче, но я обязательно освою и тот способ, с массивом, когда дойду до него. Еще, способ с массивом так много времени тратит, неужели он такой полезный ? А то по сравнению с другим, как то очень долго, хоть и профессионально, он наверно много других возможностей дает, но все же.
Аватара пользователя
El Scorpio

Re: C/C++ - Помогите пожалуйста решить проблему со словами.

Сообщение El Scorpio »

Цитата dakishi:



Я дошел до темы "функции", в которой пока копаюсь, она очень длинная.
C/C++ - Помогите пожалуйста решить проблему со словами.




Собственно говоря, я не понимаю, почему во многих учебниках в качестве "простых примеров" используют такие, где много подводных камней.

Для экспериментов лучше использовать значения типа int (цифры)






Цитата dakishi:



Еще, способ с массивом так много времени тратит, неужели он такой полезный ?
C/C++ - Помогите пожалуйста решить проблему со словами.




Видишь ли в чём дело.

Функции работы символьными массивами работают немного быстрее, но программисту при этом самому нужно контролировать операции выделения памяти и проверку длины строк. При этом малейшая ошибка может повредить данные самым непредсказуемым образом.

Вот простой пример



Код:

Код: Выделить всё

const char *sourse = "Сорок тысяч обезьян в одно место сунули банан"; //Указатель на массив символов, размещённый в области констант
char *target = malloc (32); // Указатель на область памяти размером 32 байт, выделенную в "куче" под массив символов
ctrcpy (target, sourse); // Функция копирования строки из области памяти по адресу sourse в область памяти по адресу target

Функция strcpy копирует информацию из одной области памяти в другую до тех пор, пока не встретит ноль (не символ '0' с кодом 48, а специальный символ с кодом 0), который означает конец строки - данный символ автоматически добавляется в конец исходной строки. Однако исходная строка имеет размер 41 байт, а конечная - всего 32. Таким образом, функция копирования строки затрёт 9 "лишних" байт,*необратимо повреждая информацию, которая была выделена другим объектам этой программы.

В*результате при работе программы неизбежно возникнет множество ошибок, которые "неизвестно почему" проявятся в других участках кода. Выявить причину такой ошибки - дело очень сложное. Так что лучше сразу использовать объекты типа string, которые обеспечивают автоматическую проверку размеров строк и выделения областей памяти. Благо мощность ЭВМ позволяет это делать.

А символьные указатели используют только в тех участках программы, где требуется максимальное быстродействие. Но создание таких программ - удел профессионалов, которые хорошо понимают, что и как работает
Ответить

Вернуться в «Программирование и базы данных»