Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки С#, посимвольное считывание с консоли 
:(
    Опции темы
ts_
Дата 6.10.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 6.10.2006

Репутация: нет
Всего: нет



Возможно ли к экземпляру класа "string" добавить символ "char" последовательно?
Когда я делаю вот так:
Код


            string cmnd = ("");
            char chr ;
            do
            {
                chr = (char)Console.Read();
                cmnd+=chr; 
            } while (chr != ' ');
            Console.WriteLine(cmnd);



Каждый символ кидает в отдельную строку, как сделать чтоб символы "склеивались" в одной строке?
PM MAIL ICQ   Вверх
Bogdan1024
Дата 6.10.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



Считывай String, а не char.


--------------------
user posted image
PM MAIL   Вверх
Injener
Дата 6.10.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 6.10.2006
Где: СПб

Репутация: нет
Всего: 1



На мой взгляд они и так склеиваются в одной строке. Или я не понял вопрос?
--------------------
Любое дело можно сделать тремя способами:1) правильно2) неправильно3) и так как это делают в армии
PM MAIL   Вверх
mr.DUDA
Дата 6.10.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(ts_ @  6.10.2006,  16:55 Найти цитируемый пост)
Каждый символ кидает в отдельную строку, как сделать чтоб символы "склеивались" в одной строке?

StringBuilder.Append

Добавлено @ 18:24 
Цитата(Injener @  6.10.2006,  18:20 Найти цитируемый пост)
На мой взгляд они и так склеиваются в одной строке. Или я не понял вопрос?

На каждый "+" создаётся новый экземпляр строк, т.к. стринги в дотнет - неизменяемые. Это создаёт дополнительный оверхеад по кол-ву используемой памяти, да и по быстродействию тоже, ведь добавить char в буфер с запасом (как делает StringBuilder) намного быстрее чем создать новый объект строка и скопировать туда старую строку плюс новый чар.

З.Ы. а человеку надо считывать посимвольно с консоли, пока не нажмут пробел, как я понимаю


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 6.10.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



В этой ситуации, ИМХО, лучший способ создать масив символов char[], достаточно большей длинны большой длинны. А потом сделать 
Код
string str = new string(charrArray)

P.S. Но через StringBuilder то ж не плохо  smile 
PM MAIL WWW ICQ   Вверх
Injener
Дата 6.10.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 6.10.2006
Где: СПб

Репутация: нет
Всего: 1



Я попробовал этот пример и пришел к выводу что Console.Read() работает таким образом, что при нажати на клавишу (например "м") операция Console.Read() не будет завершена. Она будет завершена тогда, когда дополнительно будет нажата клавиша Enter и только тогда будет переход к cmnd += chr; А если до нажатия клавиши Enter несколько раз нажимать на симв. кнопки то все это будет записано в буфер, и только после Enter будет продолжение цикла.

Все это я пишу для того, что я не понимаю, для чего это надо, или если сказать по другому что именно надо.
Если вопрос в том, можно ли вообще менять строки, то насколько я знаю, нет. Строка созданная в памяти НЕИЗМЕННА.
--------------------
Любое дело можно сделать тремя способами:1) правильно2) неправильно3) и так как это делают в армии
PM MAIL   Вверх
ts_
Дата 7.10.2006, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 6.10.2006

Репутация: нет
Всего: нет



Да я с самого начала попробовал StringBuilder, все получилось, потом попробовал написаный мною выше метод . В стринг билжере все нормально, а в стринге вот такая штука получилась,
так и не понял почему, при стриге оно запиывает символ "Ентера" в строку?
PM MAIL ICQ   Вверх
ts_
Дата 7.10.2006, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 6.10.2006

Репутация: нет
Всего: нет



Нужно сделать чтоб первое слово записалось в одну переменную, а второе во вторую, потом <Enter>, попробовал:

Код


            char ch;
            string cmnd = "";
            string way = "";

            do
            {
                ch = Console.ReadKey().KeyChar;
                cmnd += ch;
            } while (ch != ' ');
            ch='';
            do
            {
                ch = Console.ReadKey().KeyChar;
                way += ch;
            } while (ch != '\n');
            
            Console.WriteLine(cmnd);
            Console.WriteLine(way);



Но оно начинает бесконечно считывать символы, в чем ошибка?

Это сообщение отредактировал(а) ts_ - 7.10.2006, 01:02
PM MAIL ICQ   Вверх
Injener
Дата 7.10.2006, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 6.10.2006
Где: СПб

Репутация: нет
Всего: 1



Если вопрос только в том, чтобы считать строку, а затем разбить ее на слова, то прще
считать строку (Console.ReadLine()) потом разбить ее по символам пробела на массив слов:
Код

string cmnd = Console.ReadLine();
string[] str = cmnd.Split(' ');
for (int i = 0; i < str.Length; i++)
{
    Console.WriteLine(str[i]);
}
Console.Read();

--------------------
Любое дело можно сделать тремя способами:1) правильно2) неправильно3) и так как это делают в армии
PM MAIL   Вверх
Bogdan1024
Дата 7.10.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



ts_, так ты хочешь чтобы у тебя символы считывались с консоли без нажатия энтэр, так, что ли? Дык так .нетовскими средствами не получится сделать. Если приделывать символы так, как ты говорил в первом посте, то никаких энтеров там не вставляется в строку, не понимаю о чём ты.


--------------------
user posted image
PM MAIL   Вверх
ivashkanet
Дата 7.10.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Код

string cmnd = ("");
            char chr;
            do
            {
                chr = Console.ReadKey().KeyChar;
                cmnd += chr;
            } while (chr != ' ');
            Console.WriteLine(cmnd);

Но я бы воспользовался стринг билдером или массивом char  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.