Показать полную графическую версию : Помогите пожалуйста решить проблему со словами.
Проблема такая - я не пойму как например в условии if, например если я ввожу с клавиатуры слово, чтобы он в уловии if отвечал, но не дает, так как он кроме цифр и нескольких символов ничего не хочет брать, буквы задал при помощи ' ' - единичных кавычек, и типом char. Но проблема в том, что он берет только где то до 4-х символов, а если написать больше, то будет ошибка - error C2015: too many characters in constant. Не понимаю в чем дело.
dakishi,
кто этот таинственный он?
и неплохо бы еще кусочек кода, а то, знаете ли, "принеси то - не знаю что" не очень-то...
dakishi, Какой тип приложения? Консольный? Win32? Разработка секретная? Тем более что есть уже код, давайте его в студию. :)
Вот простой код с использованием того, что я хочу, рабочий. Это файл 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, этот он - компилятор.
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;
}
Может быть я конечно ошибаюсь, но char это символьный тип... так как же в него тогда уместить `water`?!?!
мб использовать char *q1 либо char q1[количество символов]!!!
LilLoco, В принципе да, но вдруг автору нужен ввод только одного символа? :)
В принципе да, но вдруг автору нужен ввод только одного символа? »
Ну я думаю в этом случае не стоит один символ сравнивать со строкой :)
если не поставить в условии 'q', а поставить 'water »
Может быть я, конечно, ошибаюсь, но char это символьный тип... так как же в него тогда уместить `water`?!?!
мб использовать char *q1 либо char q1[количество символов]!!! »
Я просто не совсем еще освоился, потому что я изучаю С++, много го еще не знаю. Но кроме char - я ничего другого не догадываюсь поставить, потому что я и знаю что он символьный, но других похожих не знаю, которые принимают не только цифры.
Вот вы сказали char*q1 или char[кол-во символов] - это писать там же, где я объявил тип переменных ? Просто дописать квадратные скобки, или знак умножения ? И еще, char[ кол-во символов] - в квадратных скобках число поставить ? А где сама переменная ? Объясните, пожалуйста. Если не трудно, пример приведите, как использовать то, что вы написали. Потому что я не очень понимаю, что значит это умножение и зачем оно, а количество символов в скобках - как пользоваться.
Вот вы сказали char*q1 или char[кол-во символов] - это писать там же, где я объявил тип переменных ? Просто дописать квадратные скобки, или знак умножения ? И еще, char[ кол-во символов] - в квадратных скобках число поставить ? А где сама переменная ? Объясните, пожалуйста. Если не трудно, пример приведите, как использовать то, что вы написали. Потому что я не очень понимаю, что значит это умножение и зачем оно, а количество символов в скобках - как пользоваться. »То что вы называете умножением это указатель, а квадратные скобки это массив. Просто LilLoco, немного запутал этим сообщениемтак как же в него тогда уместить `water`?!?!
мб использовать char *q1 либо char q1[количество символов]!!! »Потому что как я понял вы вводите один символ и проверяете один символ.
char ch; // в переменную 'ch' можно ввести один символ
char *ch; // Можно ввести строку символов или один символ
char ch[] = "некий массив символов"; // массив символов, хранит строку
Про указатели хорошо рассказывал (http://www.forum.oszone.net/post-1398214-8.html) 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;
}
Ну За Путаницу Извините... :sorry: :sorry: :sorry: Ну А Пример Уже Привел 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;
}
Массив - это не константа! на сколько я помню с++ то размер массива можно задавать только при помощи констант! константы это те данные которые невозможно изменить ни в каком месте программы кроме как в объявлении! а массив это как бы набор данных одного и того же типа!
void main()
{
char q1[100] // Объявление переменной q1 длинной 100 символов
cout << "Введите ..."
cin >> q1;
if (q1 == "water")
{
cout << "1";
}
else
{
cout << "2";
}
}
З.Ы. Извините за синтаксические ошибки :)
Не понимаю, почему нельзя было сделать не один символ для типа 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
Можно использоватль символьный указатель
Код:
char *name;
Или подключить библиотеку
Код:
#include <string>
и использовать тип переменной - string »
Правильным способом будет использование объектов класса string
Символьные указатели - это настолько сложная в понимании и опасная в использовании тема, что новичкам её лучше не касаться.
Спасибо большое! Я все понял. Вы мне очень помогли. Ну, я пока что не дошел до массивов. Я дошел до темы "функции", в которой пока копаюсь, она очень длинная. Да, со string легче, но я обязательно освою и тот способ, с массивом, когда дойду до него. Еще, способ с массивом так много времени тратит, неужели он такой полезный ? А то по сравнению с другим, как то очень долго, хоть и профессионально, он наверно много других возможностей дает, но все же.
El Scorpio
18-05-2010, 02:11
Я дошел до темы "функции", в которой пока копаюсь, она очень длинная. »
Собственно говоря, я не понимаю, почему во многих учебниках в качестве "простых примеров" используют такие, где много подводных камней.
Для экспериментов лучше использовать значения типа int (цифры)
Еще, способ с массивом так много времени тратит, неужели он такой полезный ? »
Видишь ли в чём дело.
Функции работы символьными массивами работают немного быстрее, но программисту при этом самому нужно контролировать операции выделения памяти и проверку длины строк. При этом малейшая ошибка может повредить данные самым непредсказуемым образом.
Вот простой пример
const char *sourse = "Сорок тысяч обезьян в одно место сунули банан"; //Указатель на массив символов, размещённый в области констант
char *target = malloc (32); // Указатель на область памяти размером 32 байт, выделенную в "куче" под массив символов
ctrcpy (target, sourse); // Функция копирования строки из области памяти по адресу sourse в область памяти по адресу target
Функция strcpy копирует информацию из одной области памяти в другую до тех пор, пока не встретит ноль (не символ '0' с кодом 48, а специальный символ с кодом 0), который означает конец строки - данный символ автоматически добавляется в конец исходной строки. Однако исходная строка имеет размер 41 байт, а конечная - всего 32. Таким образом, функция копирования строки затрёт 9 "лишних" байт,*необратимо повреждая информацию, которая была выделена другим объектам этой программы.
В*результате при работе программы неизбежно возникнет множество ошибок, которые "неизвестно почему" проявятся в других участках кода. Выявить причину такой ошибки - дело очень сложное. Так что лучше сразу использовать объекты типа string, которые обеспечивают автоматическую проверку размеров строк и выделения областей памяти. Благо мощность ЭВМ позволяет это делать.
А символьные указатели используют только в тех участках программы, где требуется максимальное быстродействие. Но создание таких программ - удел профессионалов, которые хорошо понимают, что и как работает
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.