Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+4 невидимых)

 eXeL@B —› Программирование —› ламерский вопрос по СИ++
Посл.ответ Сообщение

Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 04 мая 2008 14:29 · Поправил: locker_fx
· Личное сообщение · #1

Привет всем!

Заранее приношу свои извинения за тупейший вопрос. Решил попробовать написать что-нибудь на СИ(обычно пишу на Делфи), это можно сказать первый опыт. Вобщем переклинило меня и ни в какую не могу найти ошибку(весь хелп перерыл, гугл тоже...жопа):
вот кусок кода:

----------
string str;
cin >> str;
int j=3;
str=str.substr(0,j)+str.substr(j+1,str.length()-j);
cout << str;
----------
введём к примеру qwerty
на выходе должно быть qwety
а выводится qwety0
Как я с ним не долбался...Подскажите, пожалуйста, как избавится от 0-я в конце?

Ещё раз прошу прощения за тупейший вопрос, ну переклинило меня, с кем не бывает?

-----
моя подпись!




Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 04 мая 2008 14:32
· Личное сообщение · #2

str=str.substr(0,j)+str.substr(j+1,str.length()-j-1); попробуй



Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 04 мая 2008 14:34
· Личное сообщение · #3

tomac пишет:
str=str.substr(0,j)+str.substr(j+1,str.length()-j-1); попробуй

пробовал, бестолку...

-----
моя подпись!




Ранг: 59.9 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 04 мая 2008 14:37 · Поправил: El_Diablo
· Личное сообщение · #4

lstrcat не пробовал?
Какой компилер используешь?
Залей код полностью.
P.S.: странно, но у меня без нуля нормально выводится
http://ipicture.ru/uploads/080504/PWU0J3hmOq.jpg http://ipicture.ru/uploads/080504/PWU0J3hmOq.jpg вот скриншот



Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 04 мая 2008 14:40
· Личное сообщение · #5

El_Diablo пишет:
lstrcat не пробовал?

неа.

если честно это уже вопрос упёртости. хочу понять почему с substr такая лажа

-----
моя подпись!





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 04 мая 2008 15:52
· Личное сообщение · #6

#include <string>
#include <iostream>

std::string str;
std::cin >> str;
int j=3;
str=str.substr(0,j)+str.substr(j+1,str.length()-j);
std::cout << str;

>qwerty
>qwety

никакого нуля и все работает



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 04 мая 2008 19:30
· Личное сообщение · #7

El_Diablo пишет:
P.S.: странно, но у меня без нуля нормально выводится

Тоже все гуд работает

locker_fx
Попробуй такой скомпиль

#include<stdio.h>
#include <string>
#include <iostream>
using namespace std;

int main(int argc, char *arg[])
{
string inString;
string outString;
cin >> inString;
int j=3;
outString = inString.substr(0,j) + inString.substr(j+1,inString.length()-j);
cout << outString;
return 0;
}

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 04 мая 2008 20:34 · Поправил: S_T_A_S_
· Личное сообщение · #8

str=str.substr(0,j)+str.substr(j+1);
2й параметр можно опустить, тогда возмет подстроку до конца. '0' не должно быть ни при каких обстоятельствах, ищи ошибку в другом месте.

PS только это оверхед жуткий, лучше использовать erase()



Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 05 мая 2008 19:34
· Личное сообщение · #9

2 ALL:
ппц...сегодня всё работает. и старый код и предложенные вариации с std. код не менял, просто вчера сохранил и закрыл, а сегодня открыл и запустил.

S_T_A_S_ пишет:
'0' не должно быть ни при каких обстоятельствах, ищи ошибку в другом месте.

ноль пропал. насчёт другого места - вырезал весь лишний код.

S_T_A_S_ пишет:
PS только это оверхед жуткий, лучше использовать erase()

ок, заюзаем ирэйз.

Всем спасибо! Но тайна глюка осталась тайной

-----
моя подпись!





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 05 мая 2008 20:11
· Личное сообщение · #10

locker_fx, может ты просто не перекомпилил .exe или глючнул IDE и всё время линковал старый .obj? Такое бывает - убирай все сгенерировынные файлы когда копаешь такую ситуёвину.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 05 мая 2008 21:04
· Личное сообщение · #11

locker_fx пишет:
Но тайна глюка осталась тайной

Да тут никакой тайны нет, таких топиков много на сайтах по C/C++
Обычно они заканчиваются - утром встал, ничего не менял, все скомпилилось и работает
Всем спасибо %)

А вообще там ноль мог появиццо, если его туда специально только в конце записать
Потому как "класс basic_string(string)" создаст новый пустой буфер, метод substr выполнит все нужные действия и результат запишет в этот только что созданый буфер (qwety), а старый буфер удалит(qwerty)

В MSDN есть целый раздел(называеццо "basic_string Members") с функами(свойствами/методами) для работы со строками (там их около 50-ти) и есть маленькие готовые примеры кода

А вообще на будущее можно просто в окне редактора Visual Studio установить бряк
В проекте установить режим debug и нажать F5
Вызовется отладчик студии остановиццо на бряке и дальше трейсишь прямо по исходнику(F10/F11) и в окне Locals (Ctrl+D+L) можно видеть результаты, которые будут в твоих переменных типа str, j и т. д. (будет получаццо типа как в C#) %)

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 06 мая 2008 07:22
· Личное сообщение · #12

substr буферов не удаляет (и не може, т.к функция константная)
код примерно равносилен такому:

{
string tmp1(str, 0, j);
string tmp2(str, j+1);
str = tmp1 + tmp2; // вот здесь старый буфер str мог быть реаллоцирован, если бы результат не поместился
} // будут удалены tmp - из-за них и оверхед (а так же еще из-за временного объекта в + выше)

Короче std::string - полная *опа эффкетивности, по MSDN с ними как следует работать не научишся, лучше почитать какую-ниь книжку где про это есть... или смотреть сорцы Хотя говорят что 5й STLPort всё хитро заоптимизирует..

s0larian пишет:
убирай все сгенерировынные файлы когда копаешь такую ситуёвину

+1. в студии даже специальная команда для этого есть - rebuild all, вроде



Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 06 мая 2008 19:23
· Личное сообщение · #13

s0larian пишет:
locker_fx, может ты просто не перекомпилил .exe или глючнул IDE и всё время линковал старый .obj? Такое бывает - убирай все сгенерировынные файлы когда копаешь такую ситуёвину.

Похоже на правду. Если честно меня Борланд СИ++ билдер просто убивает, косяк на косяке...Но благо обходы предыдуших багов нагуглил, а с этим никак не мог, поэтому к Вам и обратился.
Юзаю делфи не один год глюков вроде не было(тьфу-тьфу-тьфу). Неужели Борланд под делфи ИДЕ смогла нормальный сделать, а под СИ слабо?

-----
моя подпись!





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 06 мая 2008 20:22
· Личное сообщение · #14

locker_fx, а вот и holy war... Скажу только вот что - у Borland протосто старинный убогий компилер, не сравнить даже с g++. У Microsoft компильер и быстрый и поддерживает, вроде, весь ISO C++ standard, ну а Intel генерит очень быстрый код.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 06 мая 2008 22:25
· Личное сообщение · #15

S_T_A_S_ пишет:
функция константная

Хз.. ИМХО вот так, скорее всего, будет в VS(а как там в Борланде, хз)
string tmp1(str, 0, j);
string tmp2(str, j+1);
string tmp3 = tmp1 + tmp2;
delete tmp1, tmp2, str
return tmp3 //(str)
вроде как все преобразования со строками осуществляются только с копиями строк(но может я и ошибаюсь)
ну да ладно хс. Все равно убогая реализация класса basic_string получается ИМХО

S_T_A_S_ пишет:
по MSDN с ними как следует работать не научишся

да эт точно, MSDN тут мимотазика, также как и VS...

[offtop]
S_T_A_S_ пишет:
или смотреть сорцы

хз.. Лично нет желания, да и вообще я протефф ООП
по крайней мере, в какой оно форме сейчас, если конечно тупо формочки клепать или проектик за пару десятков мину сбацать, то тут - о дааа ООП рулит %)(и то, это касается общих задач, а под конкретные надо писать все самому и ручками)

помню, читал туториал по OllyScript(вернее перевод vnekrilov`а )
у него переведено:
BPHWS, режим
// Скрипт активизирует аппаратную breakpoint с режимом
// чтение, запись, выполнение (r, w, x).
// Типы режима r, w, x
Так вот думаю, а откуда там появилось r(чтение), вроде должно быть rw, но никак не r
На железку можно ведь ставить только w, rw, x(port I/O в данном случае опускается..)
порылся в исходнике и точно
#define HB_ACCESS 2 // Active on read/write access
string str1;
if(str1 == "r")
type = HB_ACCESS;
Sethardwarebreakpoint(dw1, 1, type);
И вот увидел этот самый string str1, прикинул сколько лишнего кода и чет вообще руки опустились
А ведь движок выполняется в цикле отсюда и тормоза
Но применение string в данном случае вроде как оправдано, меньше кодить надо(да и удобнее)
S_T_A_S_ пишет:
всё хитро заоптимизирует

Много кода все равно не заоптимизируешь, чтобы он меньше стал - ИМХО

Да и у тебя проект интересный есть, хоть и опенсорсный, но сильно в нем много "прибамбасов" от C++
Если бы, ты его сделал на СИ, было бы вообще гуд - ИМХО
[/offtop]

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 06 мая 2008 22:46 · Поправил: reversecode
· Личное сообщение · #16

на ООП котить бочку ненадо)
а насчет фигового кода который генерит gcc это да
VC++ любой версии его сделает




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 07 мая 2008 04:28
· Личное сообщение · #17

locker_fx
Может это и субьективно, но в C++ Builder 6 как-то давно столкнулся с багом логических операций (смотрел тогда в отладчике по отдельности на параметры в момент сравнения и на переход в итоге), с тех пор для быстрой разработки с GUI использую C++ Builder 5, и вроде проблем за 6 лет не всплывало

-----
DREAMS CALL US




Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 08 мая 2008 20:23
· Личное сообщение · #18

Немного не в тему, но про кривость борланда. А может мою. Скажите, почему в С параметр метода - указатель на объект (this), а в дельфи - объект self, причем адрес последнего ничуть не напоминает первого. Он в стеке. И когда я его возвращал рекурсивным поиском, программа крашилась. Но тем не менее self.member := value нормально работает. Как это? Я не очень понял и ввел доп. поле в объект с его адресом. Тогда все заработало. Вот скажите, где я дурак?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 08 мая 2008 21:00 · Поправил: s0larian
· Личное сообщение · #19

Сравнивать Delphi и С++ мало смысла...

В C++ "this" это аргумент (всегда на стеке):

void MyClass::SomeMethod()
{
this->field_ = 15;
field_ = 15;
}


"This" это просто указатель на данные. Объект (instance) может быть "on the stack" или "in the heap". Приколы начинаются когда вызываешь виртуальные методы. Читай "Thinking in С++" - бесплатная книжка.



Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 10 мая 2008 21:03
· Личное сообщение · #20

s0larian пишет:
locker_fx, а вот и holy war... Скажу только вот что - у Borland протосто старинный убогий компилер, не сравнить даже с g++. У Microsoft компильер и быстрый и поддерживает, вроде, весь ISO C++ standard, ну а Intel генерит очень быстрый код.

Уже поставил себе вижуал студию 2003. Скоро серьёзный проект намечается, скорее всего в ней и буду делать.
А что под линь порекомендуете?

-----
моя подпись!




Ранг: 59.9 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 11 мая 2008 00:15
· Личное сообщение · #21

А что под линь порекомендуете?
Из IDE Eclipse, а компилер gcc



Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 11 мая 2008 08:54
· Личное сообщение · #22

=TS= пишет:
в C++ Builder 6 как-то давно столкнулся с багом логических операций

да, было у меня нечто подобное. я просто прогу переделал и заработало, а на сей факт просто забил. Оказывается не у меня одного такие баги.
У меня там ещё пачка регулярных багов в ИДЕ...

El_Diablo пишет:
компилер gcc

а версию самую последнюю?

-----
моя подпись!




Ранг: 59.9 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 11 мая 2008 09:14
· Личное сообщение · #23

Version : 4.3.0 [Stable]
www.icewalkers.com/Linux/Software/513410/gcc.html


 eXeL@B —› Программирование —› ламерский вопрос по СИ++
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати