Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите пожалуйста решить проблему со словами. (http://forum.oszone.net/showthread.php?t=175623)

dakishi 13-05-2010 22:57 1412756

Помогите пожалуйста решить проблему со словами.
 
Проблема такая - я не пойму как например в условии if, например если я ввожу с клавиатуры слово, чтобы он в уловии if отвечал, но не дает, так как он кроме цифр и нескольких символов ничего не хочет брать, буквы задал при помощи ' ' - единичных кавычек, и типом char. Но проблема в том, что он берет только где то до 4-х символов, а если написать больше, то будет ошибка - error C2015: too many characters in constant. Не понимаю в чем дело.

zonderz 13-05-2010 23:39 1412776

dakishi,

кто этот таинственный он?

и неплохо бы еще кусочек кода, а то, знаете ли, "принеси то - не знаю что" не очень-то...

Drongo 14-05-2010 12:06 1413106

dakishi, Какой тип приложения? Консольный? Win32? Разработка секретная? Тем более что есть уже код, давайте его в студию. :)

dakishi 14-05-2010 18:56 1413380

Вот простой код с использованием того, что я хочу, рабочий. Это файл C++ source file - Cpp называется всегда. Ну так вот сам код:


Код:

#include<iostream.h>
main()
{
char q1;
cin >> q1;
if (q1 == 'q') {
        cout << "1";
} else {
cout << "2";       
};
return main();
}

Выделено жирным то, что меня интересует, так как, если не поставить в условии 'q', а поставить 'water', то у меня компилятор выдает ошибку:

Цитата:

--------------------Configuration: Cpp1 - Win32 Debug--------------------
Compiling...
Cpp1.cpp
C:\Documents\C++\File\Cpp1.cpp(6) : error C2015: too many characters in constant
Error executing cl.exe.

Cpp1.exe - 1 error(s), 0 warning(s)
А я хочу чтобы например можно было вводить слова в программу, а не только цифры, при условях и.т.п. Например набрать логин и пароль. И еще, zonders, этот он - компилятор.

Drongo 14-05-2010 19:04 1413382

dakishi, используй указатель.
Цитата:

Цитата dakishi
return main(); »

Это неправильно. Лучше
return 0;

И отсутствует строка
Код:

using namespace std;
Код:

#include <iostream.h>
using namespace std;

main()
{
  char q1;

  cout << "Enter Char = ";
  cin >> q1;
  if (q1 == 'q') {
      cout << "1";
    }
  else {
    cout << "2";
    };

  cin >> q1;

return 0;
}


LilLoco 14-05-2010 19:48 1413405

Может быть я конечно ошибаюсь, но char это символьный тип... так как же в него тогда уместить `water`?!?!
мб использовать char *q1 либо char q1[количество символов]!!!

Drongo 14-05-2010 20:36 1413440

LilLoco, В принципе да, но вдруг автору нужен ввод только одного символа? :)

LilLoco 14-05-2010 20:48 1413450

Цитата:

Цитата Drongo
В принципе да, но вдруг автору нужен ввод только одного символа? »

Ну я думаю в этом случае не стоит один символ сравнивать со строкой :)

Цитата:

Цитата dakishi
если не поставить в условии 'q', а поставить 'water »


dakishi 15-05-2010 13:48 1413821

Цитата:

Цитата LilLoco
Может быть я, конечно, ошибаюсь, но char это символьный тип... так как же в него тогда уместить `water`?!?!
мб использовать char *q1 либо char q1[количество символов]!!! »

Я просто не совсем еще освоился, потому что я изучаю С++, много го еще не знаю. Но кроме char - я ничего другого не догадываюсь поставить, потому что я и знаю что он символьный, но других похожих не знаю, которые принимают не только цифры.
Вот вы сказали char*q1 или char[кол-во символов] - это писать там же, где я объявил тип переменных ? Просто дописать квадратные скобки, или знак умножения ? И еще, char[ кол-во символов] - в квадратных скобках число поставить ? А где сама переменная ? Объясните, пожалуйста. Если не трудно, пример приведите, как использовать то, что вы написали. Потому что я не очень понимаю, что значит это умножение и зачем оно, а количество символов в скобках - как пользоваться.

Drongo 15-05-2010 14:26 1413832

Цитата:

Цитата dakishi
Вот вы сказали char*q1 или char[кол-во символов] - это писать там же, где я объявил тип переменных ? Просто дописать квадратные скобки, или знак умножения ? И еще, char[ кол-во символов] - в квадратных скобках число поставить ? А где сама переменная ? Объясните, пожалуйста. Если не трудно, пример приведите, как использовать то, что вы написали. Потому что я не очень понимаю, что значит это умножение и зачем оно, а количество символов в скобках - как пользоваться. »

То что вы называете умножением это указатель, а квадратные скобки это массив. Просто LilLoco, немного запутал этим сообщением
Цитата:

Цитата LilLoco
так как же в него тогда уместить `water`?!?!
мб использовать char *q1 либо char q1[количество символов]!!! »

Потому что как я понял вы вводите один символ и проверяете один символ.

Код:

char ch; // в переменную 'ch' можно ввести один символ
char *ch; // Можно ввести строку символов или один символ
char ch[] = "некий массив символов"; // массив символов, хранит строку

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

С указателем - * можно так.

Код:

#include <iostream.h>
using namespace std;

main()
{
  char *q1;

  cout << "Enter Char = ";
  cin >> q1;
  if (*q1 == 'q') {
      cout << "1";
    }
  else {
    cout << "2";
    };

  cin >> q1;

return 0;
}


LilLoco 16-05-2010 10:21 1414350

Ну За Путаницу Извините... :sorry: :sorry: :sorry: Ну А Пример Уже Привел Drongo !!!

dakishi 16-05-2010 12:23 1414406

Цитата:

Цитата Drongo
char *ch; // Можно ввести строку символов или один символ »

Ну, я так понял, если использовать с *, я могу до нескольких символов вводить. Ну, я вроде все правильно понял. Ну, мне вообщем мне нужен такой код. Спасибо конечно большое, я многое понял, но просто здесь, почему то, ну не хочет он, хотя я думаю правильно написал. Кто либо, или вы, просто покажите код, в котором можно вводить слово, и это для меня более исправит сразу все ошибки и мне понятно будет. Только прокомментируйте, если не трудно, то, что новое, вы не говорили, а все остальное не надо. Мне просто намного легче разобраться, если это готовый код. А про массив, да я знаю, что это такое, это так же называется константой, я прав ? Но с константой я, сколько не пробовал - и так, и сяк, все равно пишет ту же самою ошибку. Не понимаю, почему нельзя было сделать не один символ для типа 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 16-05-2010 13:22 1414448

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

Код:


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

З.Ы. Извините за синтаксические ошибки :)

Drongo 16-05-2010 13:36 1414460

Цитата:

Цитата dakishi
Не понимаю, почему нельзя было сделать не один символ для типа char, а например 260 хотя бы »

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

char *name;
Или подключить библиотеку
Код:

#include <string>
и использовать тип переменной - string
Код:

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

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

Код:

#include <iostream>
using namespace std;
#include <cstring>

main()
{
  const int size = 510;  // размер символьного массива ввода
  char q1[size]; // Массив с размером в 510 символов
  char q2[] = "water"; // Проверяемое слово

  cout << "  Enter Massiv 510 Simvolov!\n"; // приглашение ввода
  cin.getline(q1, size, '\n');  // функция ввода
  cout << q1 << endl;  // ПРОВЕРКА: введённого массива, вывод массва

  if (strcmp(q1, q2) == 0) { // strcmp - функция сравнивания строк.
      cout << "1" << endl;    // Если возвращает ноль - строки равны.
      cout << q1;              // Если возращает "-1" - то строка q1 Больше q2
    }                        // Если возращает "1" - то строка q1 Меньше q2
  else {
    cout << "2" << endl;
    cout << q1;
    };

  cin >> q1;

return 0;
}


El Scorpio 17-05-2010 09:34 1414950

Цитата:

Цитата Drongo
Можно использоватль символьный указатель
Код:
char *name;
Или подключить библиотеку
Код:
#include <string>
и использовать тип переменной - string »

Правильным способом будет использование объектов класса string
Символьные указатели - это настолько сложная в понимании и опасная в использовании тема, что новичкам её лучше не касаться.

dakishi 17-05-2010 18:02 1415294

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

El Scorpio 18-05-2010 02:11 1415687

Цитата:

Цитата dakishi
Я дошел до темы "функции", в которой пока копаюсь, она очень длинная. »

Собственно говоря, я не понимаю, почему во многих учебниках в качестве "простых примеров" используют такие, где много подводных камней.
Для экспериментов лучше использовать значения типа int (цифры)


Цитата:

Цитата dakishi
Еще, способ с массивом так много времени тратит, неужели он такой полезный ? »

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

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

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

dakishi 19-05-2010 21:50 1417039

Спасибо большое!


Время: 17:12.

Время: 17:12.
© OSzone.net 2001-